如何否定整个正则expression式?

我有一个正则expression式,例如(ma|(t){1}) 。 它匹配mat ,并不符合bla

我想否定正则expression式,因此它必须匹配bla而不是mat通过给这个正则expression式添加一些东西 。 我知道我可以写bla ,但是实际的正则expression式却更复杂。

使用反面查找:(?! pattern )

积极的概念可以用来断言模式匹配。 消极的概念是相反的:它用来断言模式不匹配。 有些味道支持断言; 有的放眼望去等等

链接到regular-expressions.info

  • Lookahead和Lookbehind零宽度断言
  • 味道比较

也可以看看

  • 如何将CamelCase转换为Java中的可读名称?
  • 所有string的正则expression式不包含string?
  • 一个正则expression式来匹配没有被某个其他子string跟踪的子string。

更多的例子

这些是试图提出正则expression式解决玩具问题的练习; 他们应该是教育,如果你想学习各种方式,你可以使用lookarounds(嵌套,使用它们捕获等):

  • codingBat plusOut使用正则expression式
  • codingBat repeatEnd使用正则expression式
  • codingbat使用正则expression式的wordEnds

假设你只想禁止完全匹配正则expression式的string(即, mmbla是好的,但mm不是),这是你想要的:

 ^(?!(?:m{2}|t)$).*$ 

(?!(?:m{2}|t)$)是负向前瞻 ; 它说:“从当前位置开始,接下来的几个字符不是 mmt ,接着是string的结尾。 开始处的起始锚点( ^ )确保在该string的开始处应用前瞻。 如果成功,则.*会继续并消耗string。

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

 \b(?=\w)(?!(ma|(t){1}))\b(\w*) 

这是给定的正则expression式。
\ b是find字边界。
积极的outlook(?= \ w)在这里是为了避免空间。
对原始正则expression式的负面观察是阻止匹配。
最后(\ w *)是要抓住剩下的所有单词。
将要举办这个词的小组是第3组。
简单的(?!模式)将不会像任何子string匹配
简单的^(!!(?:m {2} | t)$)。* $将不起作用,因为它的粒度是满行