如何否定整个正则表达式?
我有一个正则表达式,例如(ma|(t){1})
。 它与ma
和t
相匹配,并且与bla
不匹配。
我想否定正则表达式,因此它必须匹配bla
而不是ma
和t
, 通过向此正则表达式添加内容 。 我知道我可以写bla
,但实际的正则表达式更复杂。
使用负环视: (?!
pattern
)
积极的概念可以用来断言模式匹配。 否定的变换是相反的:它用于断言模式不匹配。 一些风味支持断言; 有些限制了后视等。
链接到regular-expressions.info
也可以看看
更多例子
这些尝试提出正则表达式解决玩具问题的练习; 如果你想学习使用lookarounds的各种方法(嵌套它们,使用它们捕获等),它们应该是教育性的:
假设你只想禁止完全匹配正则表达式的字符串(即, mmbla
是好的,但mm
不是),这是你想要的:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
是负向预测; 它说:“从当前位置开始,接下来的几个字符不是mm
或t
,接着是字符串的结尾。” 开始处的起始锚点( ^
)确保在字符串的开始处应用前瞻。 如果成功, .*
会继续并消耗字符串。
仅供参考,如果您使用Java的matches()
方法,您并不需要^
和最终$
,但它们不会造成任何伤害。 尽管如此,在预见中的$
是必需的。
b(?=w)(?!(ma|(t){1}))b(w*)
这是给定的正则表达式。
b是找到字边界。
积极向前看(?= w)是为了避免空格。
对原始正则表达式的负面观察是为了防止匹配。
最后( w *)将捕获剩下的所有单词。
将持有这些词语的组是第3组。
简单的(?!模式)不会像任何子字符串匹配一样工作
简单的^(!!(?: m {2} | t)$)。* $将不起作用,因为它的粒度是全线