使用[^]语法匹配一个单词,但不匹配它的逆词

时间:2018-08-23 15:28:25

标签: regex scala cucumber

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

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并处理该捕获组中的内容,但是我很好奇如何纯粹使用此功能正则表达式。

2 个答案:

答案 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个或更多字母单词。