我能够使用(.+)(?=\1+)
找到给定句子的重复模式。但是当我在一个句子中的两个特定单词之间尝试相同时,它会失败并且#34;没有匹配"。
我在这里遗漏了什么。
示例:
abc def def def def ghi ghi xyz
当我使用/abc (.+)(?=\1+) xyz/
时,它失败并且没有匹配。
不要在任何条件限制下添加第一个单词和第二个单词。 所以我希望正则表达式声明属于这种类型 / abc正则表达式def /
答案 0 :(得分:0)
为了响应您的编辑,您首次使用的模式不起作用,因为(1)您没有正确计算空格,(2)您过度指定匹配的段必须在哪里开始和结束,以及(3)你没有真正正确使用先行功能。这是一个更深入的解释:
abc
和def
之间,您可以限制可与def def def
,def def
或def
匹配的子字符串def
必须与\1+
匹配。但def
以空格开头,因此无法匹配任何上述字符串(def def def
,def def
或def
)。您实际尝试做的事情是指示字符串的匹配段应该在前面<{1}}和 >跟随单词abc
。在这种情况下,只需使用lookbehind和lookahead:
def
我摆脱了你原来的前瞻;你想要的匹配(即重复的单词)在第一个捕获组中(即变量/(?<=\babc\b).*?(\w+)\W+(\1\b\W*)+.*?(?=\bdef\b)/
)。请注意,除了$1
“字边界”零宽度原子之外,我使用\w
和\W
来区分单词和非单词字符。
编辑:前瞻/后视实际上是不必要的。由于你想使用没有它们的模式,这里是你想要的版本:
\b