首页 > 解决方案 > 使用 [^] 语法匹配一个单词但不匹配它的反义词

问题描述

我正在尝试制作一个匹配一个单词但确实匹配其反向的正则表达式。例如,如果我不想匹配的单词是“no”:

I am matching this word   // will pass
I am matching no word     // will not pass
I am matching on word     // will pass
I am matching that word   // will pass

我正在使用的当前正则表达式没有传递第三个示例,因为它不匹配任何带有“n”或“o”的单词:

^I am matching ([^no]*) word$

实现这一目标的最佳方法是什么 - 即匹配一个单词,而不是字符集合?

对于上下文,我正在使用 Scala 和 Cucumber 编写验收测试,它们使用正则表达式将功能文件与其相应的 stepdef 匹配。我的现实世界的例子更复杂,所以我在这里简化了它。另外,我知道我可以使用 Scala 中的/块来捕获(.*)和处理该捕获组中的内容,但我很好奇如何使用纯正则表达式来做到这一点。casematch

标签: regexscalacucumber

解决方案


您可以使用否定前瞻来测试您将要匹配的文本:

^I am matching (?!no\b)(?<CapturedWord>\w+) word$

(?!no\b)- 这是一个负前瞻。它测试接下来的两个字符。如果它们是“否”,后跟一个单词边界,则匹配失败。其他任何事情都会过去。前瞻实际上并没有捕捉到这些字符,所以......

(?<CapturedWord>\w+)- ...我们需要捕捉角色以便继续进行其余的测试。我使用了一个命名组,因为它们通常更容易在以后的代码中引用。


推荐阅读