正则表达式模式找到两个特定单词之间的单词重复

时间:2014-05-05 21:01:18

标签: regex perl

我能够使用(.+)(?=\1+)找到给定句子的重复模式。但是当我在一个句子中的两个特定单词之间尝试相同时,它会失败并且#34;没有匹配"。

我在这里遗漏了什么。

示例:

abc def def def def ghi ghi xyz

当我使用/abc (.+)(?=\1+) xyz/时,它失败并且没有匹配。

不要在任何条件限制下添加第一个单词和第二个单词。 所以我希望正则表达式声明属于这种类型 / abc正则表达式def /

1 个答案:

答案 0 :(得分:0)

为了响应您的编辑,您首次使用的模式不起作用,因为(1)您没有正确计算空格,(2)您过度指定匹配的段必须在哪里开始和结束,以及(3)你没有真正正确使用先行功能。这是一个更深入的解释:

  • 通过指定模式位于abcdef之间,您可以限制可与def def defdef defdef匹配的子字符串
  • 据推测,您希望匹配上述三个选项中的第一个以进行匹配。但请注意,因为您的第二个组是预见,所以第一个组必须匹配整个子字符串
  • 前瞻意味着前瞻原子后的字符串与前瞻原子匹配。因此,您的模式表明def必须与\1+匹配。但def以空格开头,因此无法匹配任何上述字符串(def def defdef defdef)。

实际尝试做的事情是指示字符串的匹配段应该前面<{1}}和 >跟随单词abc。在这种情况下,只需使用lookbehind和lookahead:

def

我摆脱了你原来的前瞻;你想要的匹配(即重复的单词)在第一个捕获组中(即变量/(?<=\babc\b).*?(\w+)\W+(\1\b\W*)+.*?(?=\bdef\b)/ )。请注意,除了$1“字边界”零宽度原子之外,我使用\w\W来区分单词和非单词字符。

编辑:前瞻/后视实际上是不必要的。由于你想使用没有它们的模式,这里是你想要的版本:

\b