我正在尝试制作一个正则表达式,它不匹配一个单词,但 匹配其相反的单词。例如,如果我不想匹配的单词是“否”:
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编写验收测试,它们使用Regex将功能文件与其对应的stepdef进行匹配。我的实际示例更加复杂,因此在此进行了简化。另外,我知道我可以使用Scala中的(.*)
/ case
块来捕获match
并处理该捕获组中的内容,但是我很好奇如何纯粹使用此功能正则表达式。
答案 0 :(得分:3)
您可以使用否定前瞻来测试您要匹配的文本:
^I am matching (?!no\b)(?<CapturedWord>\w+) word$
(?!no\b)
-这是negative lookahead。它测试接下来的两个字符。如果它们为“ no”后跟word boundary,则匹配失败。其他一切都会过去。前瞻实际上并不能捕获这些字符,所以...
(?<CapturedWord>\w+)
-...我们需要捕获字符以继续进行其余的测试。我使用了named group,因为它们通常在以后的代码中更容易引用。
答案 1 :(得分:0)
另一个解决方案是描述所有不在“ on”上的单词。请注意,如果您想否定一个长子字符串,此解决方案并不方便,但是对于一些不具有超前功能的正则表达式引擎,这是唯一的方法:
^I am matching ([^\Wn]\w+|n[^\Wo]+|\w(?:\w{2,})?) word$
交替的前两个分支特别匹配所有不是“ no”的2个字母单词,最后一个分支匹配一个字母和3个或更多字母单词。