我有一个正则表达式,例如(ma|(t){1})
。它与ma
和t
匹配,与bla
不匹配。
我想否定正则表达式,因此它必须匹配bla
而不是ma
和t
,通过向此正则表达式添加内容。我知道我可以写bla
,但实际的正则表达式更复杂。
答案 0 :(得分:87)
使用否定的外观:(?!
pattern
)
可以使用正面外观来断言模式匹配。否定的外观恰恰相反:它用于断言模式不匹配。一些风味支持断言;有些人会限制看守等等。
尝试将玩具问题的正则表达式解决方案作为练习;如果您正在尝试学习各种使用外观的方法(嵌套它们,使用它们捕获等),它们应该具有教育意义:
答案 1 :(得分:45)
假设你只想完全禁止与正则表达式匹配的字符串(即mmbla
没问题,但mm
不正确),这就是你想要的:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
是否定的lookahead;它说“从当前位置开始,接下来的几个字符不 mm
或t
,然后是字符串的结尾。”开头的锚点(^
)确保在字符串的开头应用前瞻。如果成功,则.*
继续并消耗字符串。
仅供参考,如果您使用的是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'