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

时间:2010-04-14 13:25:59

标签: regex regex-negation

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

我想否定正则表达式,因此它必须匹配bla而不是mat通过向此正则表达式添加内容。我知道我可以写bla,但实际的正则表达式更复杂。

4 个答案:

答案 0 :(得分:87)

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

可以使用正面外观来断言模式匹配。否定的外观恰恰相反:它用于断言模式不匹配。一些风味支持断言;有些人会限制看守等等。

指向regular-expressions.info

的链接

另见

更多例子

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

答案 1 :(得分:45)

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

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

(?!(?:m{2}|t)$)是否定的lookahead;它说“从当前位置开始,接下来的几个字符 mmt,然后是字符串的结尾。”开头的锚点(^)确保在字符串的开头应用前瞻。如果成功,则.*继续并消耗字符串。

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

答案 2 :(得分:0)

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

这是给定的正则表达式。
\ b是找到单词边界 正向前看(?= \ w)就是为了避免空格 对原始正则表达式的负面看法是为了防止它的匹配 最后(\ w *)是要抓住剩下的所有单词 将持有单词的组是第3组。
简单的(?!模式)将不起作用,因为任何子字符串都匹配
简单的^(?!(?:m {2} | t)$)。* $不起作用,因为它的粒度是实线

答案 3 :(得分:0)

如果您使用laravel,请套用它。

Laravel有一个not_regex,其中正在验证的字段必须与给定的正则表达式不匹配;在内部使用PHP preg_match函数。

'email' => 'not_regex:/^.+$/i'