匹配所有正则表达式模式,直到达到定界模式

时间:2019-03-31 14:41:54

标签: regex pcre

我有以下正则表达式:

\w{6,}(?=(\s|\n)*hello there)

我正在尝试匹配所有模式,直到到达字符串“ hello there”为止。

ASD abc1234 
fegds abc12345 
xyz456 GD (jdkjf)
xyz1234 GD (jdkjf)
(jsdfk) def123 kjfg abc493 

hello there

kjfg feg4493

它似乎只匹配“ abc493”,而实际上应该匹配所有6种模式: “ abc1234”, “ abc12345”, “ xyz456”, “ xyz1234”, “ def123”,以及 “ abc493”

如何修改上面的正则表达式以获取正确的结果?

3 个答案:

答案 0 :(得分:2)

这可能是您想要的当前模式的版本:

\w{6,}(?=[\s\S]*\bhello there\b)

这里的问题是您想跨行匹配。也许.*本身不会使用您当前的工具执行该操作。

如果您的正则表达式风格恰好支持DOT ALL模式,则可以使用以下模式:

\w{6,}(?=.*\bhello there\b)

这是第二个.*版本的演示,该版本使用DOT ALL模式,显示您预期的六个匹配项。

Demo

答案 1 :(得分:2)

如果要捕获hello there之前的所有6个字符的字符串,则正确的正则表达式为:

\w{6,}(?=[\s\S]*hello there)

[\s\S]表示任何字符是否为空格(实际上,如果要使用single line mode,则等同于(?s).*的所有字符)。

有关演示,请参见here

P.S。如果您想将hello there用作全行定界符,请将其替换为(?m)^hello there$

答案 2 :(得分:2)

在PCRE中,您可以使用回溯动词来代替前行,在这种情况下,后者表现得更好:

(?s)hello there.*(*SKIP)(*F)|\w{6,}

请参见live demo here