使用正则表达式查找不在另一个单词后面的单词

4

什么是正则表达式模式,我应该使用哪个模式才能匹配特定的单词,该单词不在另一个特定的单词之后?

例如:

我正在寻找一个“abc”,它不在“xyz”之后出现,因此以下内容将匹配:

xxabc

p abc

以下内容不会生效:
xyz abc

谢谢!


这些答案使用了负向后瞻 - 这很好,但请注意并非所有的正则表达式引擎都支持此功能。例如,JavaScript 正则表达式就不支持。 - vcsjones
你想在abc之前立即匹配xyz失败,还是在abc的_任何位置_之前匹配xyz失败? - Jerry
2个回答

6
最简单的方法是使用负回顾断言:
(?<!xyz)(?<!xyz )abc

你在字母组之间的间距变化表明,abcxyz之间的距离可能会有所不同。如果你只想在字符串中找到以前从未被xyz紧随其后的abc,那么你可能需要采用类似于以下的方法:
^(?!xyz)*((?!xyz).)*abc

后面的正则表达式使用反向匹配的等价物,而不是负回顾断言。

这个答案值得点赞,因为它是唯一一个提供不涉及回顾后发的解决方案。但我不明白为什么你需要(.(?!xyz))*((?!xyz).)*两个表达式,特别是考虑到第一个表达式是有问题的。当你把点放在前瞻符号的前面时,它不会开始过滤直到第二个字符。这就是为什么你的正则表达式错误地匹配了字符串“xyz abc”的原因。 - Alan Moore
@Alan Moore,非常好的观点。感谢你指出这一点。我修改了第一个括号表达式,使其主要目的是在xyz紧接着abc(没有任何中间字符)的情况下捕获xyz。谢谢。 - Justin O Barber

0
你需要像这样的东西:
(?<!xyz )abc

Regular expression visualization

Debuggex演示

但是语法会有所不同,取决于您使用的编程语言。例如,在JavaScript中,这种语法将无法工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接