如何否定整个正则表达式?

IAd*_*ter 83 regex regex-negation

例如,我有正则表达式(ma|(t){1}).它匹配mat不匹配bla.

我想否定正则表达式,因此必须匹配bla,而不是mat,加入的东西此正则表达式.我知道我可以写bla,但实际的正则表达式更复杂.

pol*_*nts 91

使用否定的外观: (?!pattern)

正面外观可用于断言模式匹配.否定的外观恰恰相反:它用于断言模式不匹配.一些风味支持断言; 一些人对外观等有所限制.

指向regular-expressions.info的链接

也可以看看

更多例子

这些尝试是为玩具问题提出正则表达式解决方案作为练习; 如果你正在尝试学习各种使用外观的方法(嵌套它们,使用它们来捕获等),它们应该具有教育意义:

  • 我觉得这样不对,请参阅http://stackoverflow.com/questions/8610743/how-to-negate-any-regular-expression-in-java以获得正确的替代方案. (4认同)
  • regular-expressions.info对于所有正则表达式来说都是一个非常好的资源. (2认同)
  • 这个简单的例子只适用于^(?!([m] {2} |(t){1})) (2认同)

Ala*_*ore 50

假设您只想完全禁止与正则表达式匹配的字符串(即,mmbla可以,但mm不是),这就是您想要的:

^(?!(?:m{2}|t)$).*$
Run Code Online (Sandbox Code Playgroud)

(?!(?:m{2}|t)$)是一个负面的先行 ; 它说"从当前位置开始,接下来的几个字符不是, mm或者t后面是字符串的结尾." 开头的锚点(^)确保在字符串的开头应用前瞻.如果成功,.*则继续并消耗字符串.

仅供参考,如果您使用的是Java的matches()方法,那么您并不需要它^和最终版本$,但它们不会造成任何伤害.但是$,前瞻性内部是必需的.

  • 这个答案最有用的部分是你必须在正则表达式的末尾添加`.*`,否则它会拒绝每个字符串。 (2认同)
  • `$` *inside* 负前瞻和末尾的 `.*` 都是关键位。与 RE 一样,一组强大的单元测试对于使其正确至关重要。这个答案是 100% 正确的。 (2认同)