正则表达式。 PCRE。在文本中的任意位置查找重复的单词

Regex. PCRE. Find repeated words anywhere in the text

我需要找到在文本中3 次或更多任何地方 重复的单词。 像这样找到连续重复的单词非常容易:

\b(\w+)\s+\b

但我真的不知道如何为每个单词设置一个反向引用。我应该只为每组重复的单词设置一个反向引用。

如何select更多更多words words 甚至 more 其中 more

在这个例子中是否可以反向引用 morewords

\b(\w+).*\b

以下模式应该有效:

\b(\w+)\b(.*?\b\b){2}

Demo

这会匹配任何单词,然后在文本中的任意位置再出现两次相同的单词。

编辑:

如果出于某种原因,您想在此处使用两个不同的反向引用,请尝试以下模式:

\b(\w+)\b.*?().*?

第二个反向引用的定义很简单,就是(),即捕获的第一个反向引用,当然也是同一个重复词。

根据评论,对于您的要求,您可以使用:

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

关于群组

该模式使用了一个外部捕获组和 2 个内部捕获组。

对于第 1 组中捕获的每个词,最接近的 2 个词在第 2 组和第 3 组中被捕获,使它们至少重复 3 次。

要记住的是,如果处理组和之后的匹配,会有重叠匹配。

说明

  • \b 字边界
  • ( 捕获 组 1
    • \w{4,}匹配一个单词字符4次或更多次
  • ) 关闭群组
  • \b 字边界
  • (?=正向前瞻,断言右边的是
    • .*? 匹配除换行符之外的任何字符非贪婪
    • \b()\b 捕获 组 2,匹配组 1
    • .*? 匹配除换行符之外的任何字符非贪婪
    • \b()\b 捕获 组 3 匹配组 1
  • )

Regex demo

编辑

要匹配一个词后跟同一个词 2 次但不是 3 次,您可以使用正前瞻 (?= 断言组 1 后跟 2 次组 1 和负前瞻 (?! 断言第 1 组未被第 1 组关注 3 次。

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

Regex demo