代码之家  ›  专栏  ›  技术社区  ›  James Whiteley

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

  •  0
  • James Whiteley  · 技术社区  · 7 年前

    匹配一个单词,但是 与它的反面相匹配。例如,如果我不想匹配的单词是“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
    

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

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

    对于上下文,我正在使用Scala和Cucumber编写验收测试,它们使用Regex将功能文件与其对应的stepdef匹配起来。我的真实世界的例子更复杂,所以我把它简化了。而且,我知道我能抓住 (.*) 并使用 case / match 在Scala中阻塞,但我很好奇如何使用纯Regex来实现这一点。

    2 回复  |  直到 7 年前
        1
  •  3
  •   JDB    7 年前

    您可以使用“负向前”来测试要匹配的文本:

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

    (?!no\b) -这是一个 negative lookahead . 它测试接下来的两个字符。如果他们是“不”,然后是 word boundary ,则匹配失败。其他事情都会过去的。前视并不能捕捉到这些角色,所以。。。

    (?<CapturedWord>\w+) -…我们需要捕获字符以便继续测试的其余部分。我用了一个 named group 因为它们通常在以后的代码中更容易引用。

        2
  •  0
  •   Casimir et Hippolyte    7 年前

    ^I am matching ([^\Wn]\w+|n[^\Wo]+|\w(?:\w{2,})?) word$
    

    交替的前两个分支特别匹配所有不是“no”的2个字母单词,最后一个分支匹配一个字母和3个或更多字母单词。