正则表达式匹配一个字,除非前面的线用一句话结束

问题描述:

我有一个包含许多句子,使用回车符和任意空格分隔:正则表达式匹配一个字,除非前面的线用一句话结束

Some thing. 
    Some other text. 
Some line. 
    Some additional text. 
Some stuff. 
    Some additional text. 
Some additional text. 

如何匹配只有那些Some字,其中上一行不以thingstuff结束?

对于上面的例子中,我将匹配这些话:

Some thing.   
    Some other text.   <-- skip, previous line ends with "thing." 
[Some] line. 
    [Some] additional text. 
[Some] stuff. 
    Some additional text. <-- skip, previous line ends with "stuff." 
[Some] additional text. 

我试过(?<!thing\.|stuff\.)[\r\n\s]+Some,但我不知道如何以包括负回顾后的空格+换行?我发现一些使用\K的例子允许“可变长度”匹配,但我显然不明白\K究竟如何,因为我无法匹配任何东西。

+2

“Some”开头的情况如何? – dawg

您可以使用“sacrificial match”与非捕获组来匹配你不想然后允许匹配你想在捕获组什么什么:

/(?:^\s*Some.*(?:thing\.|stuff\.)\s*^\s*Some)|(^\s*Some)/m 

Demo

或者,如果你想在第一和第四(如评论所说,你的例子是不一致的......)

/(?:(?:thing\.|stuff\.)\s*Some)|(^\s*Some)/m 

Demo

或者跳过第一Some,包括第四:

/(?:(?:thing\.|stuff\.)\s*Some)|((?<=\n)\s*Some)/m 

Demo

此方法适用于大多数的正则表达式的口味。

在这种情况下,负面看后面是一个问题,因为后面的外观需要固定宽度。您所描述的\s*不是固定宽度。

您可以使用PCRE动词(*SKIP)(*F)失败已知抹茶并轮流使用使用你的对手:

(?:thing|stuff)\.\R\s*\w+(*SKIP)(*F)|\bSome\b 

RegEx Demo

这里(?:thing|stuff)\.\R\s*.*(*SKIP)(*F)将跳过&当上一行与thing.或结束失败的比赛stuff.。在交替的右侧,我们只会得到我们的比赛。