正则表达式匹配一个字,除非前面的线用一句话结束
问题描述:
我有一个包含许多句子,使用回车符和任意空格分隔:正则表达式匹配一个字,除非前面的线用一句话结束
Some thing.
Some other text.
Some line.
Some additional text.
Some stuff.
Some additional text.
Some additional text.
如何匹配只有那些Some
字,其中上一行不以thing
或stuff
结束?
对于上面的例子中,我将匹配这些话:
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
究竟如何,因为我无法匹配任何东西。
答
您可以使用“sacrificial match”与非捕获组来匹配你不想然后允许匹配你想在捕获组什么什么:
/(?:^\s*Some.*(?:thing\.|stuff\.)\s*^\s*Some)|(^\s*Some)/m
或者,如果你想在第一和第四(如评论所说,你的例子是不一致的......)
/(?:(?:thing\.|stuff\.)\s*Some)|(^\s*Some)/m
或者跳过第一Some
,包括第四:
/(?:(?:thing\.|stuff\.)\s*Some)|((?<=\n)\s*Some)/m
此方法适用于大多数的正则表达式的口味。
在这种情况下,负面看后面是一个问题,因为后面的外观需要固定宽度。您所描述的\s*
不是固定宽度。
答
您可以使用PCRE动词(*SKIP)(*F)
失败已知抹茶并轮流使用使用你的对手:
(?:thing|stuff)\.\R\s*\w+(*SKIP)(*F)|\bSome\b
这里(?:thing|stuff)\.\R\s*.*(*SKIP)(*F)
将跳过&当上一行与thing.
或结束失败的比赛stuff.
。在交替的右侧,我们只会得到我们的比赛。
“Some”开头的情况如何? – dawg