匹配所有正则表达式模式,直到达到分隔模式

问题描述 投票:2回答:3

我有以下正则表达式:

\w{6,}(?=(\s|\n)*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”

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

regex pcre
3个回答
2
投票

在PCRE中,您可以使用回溯动词而不是前瞻,这在这种情况下表现更好:

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

live demo here


2
投票

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

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

这里的问题是你想要跨行匹配。也许.*本身不会用你当前的工具那样做。

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

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

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

Demo


2
投票

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

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

其中[\s\S]是指任何空间或非空间(几乎所有的东西,相当于(?s).*,如果你想使用single line mode)。

有关演示,请参阅here

附:如果你想让hello there成为一个全行分隔符,用(?m)^hello there$替换它

© www.soinside.com 2019 - 2024. All rights reserved.