如何否定整个正则expression式?
我有一个正则expression式,例如(ma|(t){1})
。 它匹配ma
和t
,并不符合bla
。
我想否定正则expression式,因此它必须匹配bla
而不是ma
和t
, 通过给这个正则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)$)
是负向前瞻 ; 它说:“从当前位置开始,接下来的几个字符不是 mm
或t
,接着是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)$)。* $将不起作用,因为它的粒度是满行