110

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

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

4

4 回答 4

115

使用否定环视:(?!pattern)

积极的环顾四周可用于断言模式匹配。否定的环视则相反:它用于断言模式不匹配。一些风格支持断言;有些限制了lookbehind等。

链接到正则表达式.info

也可以看看

更多示例

这些是尝试提出玩具问题的正则表达式解决方案作为练习;如果您尝试学习可以使用环视的各种方式(嵌套它们、使用它们捕获等),它们应该具有教育意义:

于 2010-04-14T13:31:22.483 回答
61

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

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

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

仅供参考,如果您使用 Java 的matches()方法,则实际上并不需要 the^和 final $,但它们不会造成任何伤害。不过,$内部的前瞻是必需的。

于 2010-04-14T13:52:08.380 回答
1
\b(?=\w)(?!(ma|(t){1}))\b(\w*)

这是给定的正则表达式。
\b 是查找单词边界。
积极向前看 (?=\w) 是为了避免空格。
对原始正则表达式的负面展望是为了防止它的匹配。
最后 (\w*) 是捕获所有剩下的单词。
包含单词的组是第 3 组。
简单的 (?!pattern) 将不起作用,因为任何子字符串都将匹配
简单的 ^(?!(?:m{2}|t)$).*$ 将不起作用,因为它的粒度是全行

于 2017-10-08T08:01:27.393 回答
0

如果你使用 laravel,应用这个。

Laravel 有一个 not_regex where 被验证的字段不能匹配给定的正则表达式;在内部使用 PHPpreg_match函数。

'email' => 'not_regex:/^.+$/i'
于 2020-08-25T13:57:09.397 回答