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

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

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

223855 次浏览

使用负向查看: (?!pattern)

可以使用正向查找来断言模式匹配。负向查找则相反: 它用于断言模式不匹配。有些风格支持断言; 有些风格限制回顾等等。

链接到 regular-expressions.info

参见

更多的例子

这些都是试图用正则表达式解决玩具问题的练习; 如果你想学习各种各样的方法来使用 Lookararound (嵌套它们,使用它们来捕捉,等等) ,它们应该是有教育意义的:

假设您只想禁用与正则表达式完全匹配的字符串(例如,mmbla可以,但 mm不行) ,那么您需要的是:

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

(?!(?:m{2}|t)$)是负的 向前看,它表示“从当前位置开始,接下来的几个字符是 没有 mmt,后面是字符串的结尾。”开始部分的起始锚(^)确保在字符串的开始部分应用前瞻。如果成功,则 .*继续前进并使用字符串。

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

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

这是给定的正则表达式。
B 是找到单词边界。
积极的向前看(? = w)是为了避免空格。
对原始正则表达式的负面预期是为了防止它的匹配。
最后(w *)是捕捉所有剩下的单词。
保存单词的组是第三组。
这个简单的(? ! 模式)将无法工作,因为任何子字符串都将匹配
简单的 ^ (? ! (? : m {2} | t) $) . * $不起作用,因为它的粒度是完整的行

如果你使用幼虫,请使用这个。

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

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

这个正则表达式计算你的情况:

^.*(?<!ma|t)$

看看它是如何工作的: Https://regex101.com/r/ryg2fx/1