正则表达式匹配文本2次的文字

时间:2012-09-22 07:30:00

标签: regex

我需要匹配一个在文本中出现2次的英文文本。我试过了

(^|\ )([^\ ][^\b]*\b).*\ \2\b

但这与所有行都不匹配。

1 个答案:

答案 0 :(得分:3)

你的正则表达式存在一些问题。例如,\b字边界不能用于字符类,因此[^\b]*将无法按预期工作。

你可能想要像

这样的东西
(?s)\b(\w+)\b.*\b\1\b

这将匹配从第一次出现的单词到最后一次出现的整个文本。这可能不是你实际想要的。

另一个想法:

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

这将仅匹配第一次出现的单词与下一单词的文本。

这两种方法的问题在于例如像

这样的文本
foo bar bar foo

正则表达式将从foofoo匹配,盲目地忽略中间存在重复的bar

因此,如果您确实想要查找重复出现的所有单词,请使用

(?s)\b(\w+)\b(?=.*?\b\1\b)

<强>解释

(?s)       # Allow the dot to match newlines
\b(\w+)\b  # Match an entire word
(?=        # Assert that the following regex can be matched from here:
 .*?       #  Any number of characters
 \b\1\b    #  followed by the word that was previously captured
)          # End of lookahead