【问题标题】:Match repeated 3 or more times匹配重复 3 次或更多次
【发布时间】:2019-03-03 12:32:29
【问题描述】:

这是一个测验练习

我想知道文本中是否包含 4 个或更多字符且在文本中(文本中的任何位置)重复 3 次或更多次的词。如果是这样,为每个单词设置一个(并且只有一个)反向引用。

我试过代码

(?=\b(\w{4,}+)\b.*\1)

结果返回

测试 10/39:不工作,抱歉。再次阅读任务描述。它匹配 notword word word

试过了

(?=(\b\w{4,}\b)(?:.*\b\1\b){2,})

测试 22/39:如果某个单词重复多次,则您设置了超过 1 个反向引用(常见错误,我知道)。您不一定需要匹配单词的第一次出现。你能避免匹配 >wordword

正则表达式demo

【问题讨论】:

  • 你使用什么编程语言或工具?

标签: regex


【解决方案1】:

如果我正确理解您的问题,这应该可以满足您的要求:

(?=(\b\w{4,}\b)(?:.*\b\1\b){2})(?!(\b\w{4,}\b)(?:.*\b\1\b){3})

它与您的正则表达式基本相同,寻找重复的 4 个字符的单词,但它会寻找 2 次额外出现(因此出现 3 次)。匹配的单词将被捕获在第 1 组中。正则表达式包含 3 次重复的否定前瞻,因此如果相同的单词出现 4 次或更多次,它就不会匹配两次。

Demo on regex101

【讨论】:

  • 在演示链接中只匹配出现3次的单词,这不是你想要的吗?
  • @LyuJH 查看我的编辑和更新演示。我在第一组周围添加了分词符,以确保它只匹配整个单词。
  • (?=(\b\w{4,}\b)(?:.*\b\1\b){2,}) 表明测试 22/39:如果某个单词重复多次,您设置了超过 1 个反向引用(常见错误,我知道)。您不一定需要匹配单词的第一次出现。你能避免匹配 >wordword
  • @LyuJH 看到我的编辑。如果单词出现超过 3 次,它包括一个否定的前瞻以避免匹配超过一次。
猜你喜欢
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2020-09-21
相关资源
最近更新 更多