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

7kqas0il  于 2022-11-26  发布在  其他
关注(0)|答案(5)|浏览(131)

我有一个正则表达式,例如(ma|(t){1})。它匹配mat,但不匹配bla
我想否定这个正则表达式,因此它必须匹配bla,而不是mat通过添加一些东西到这个正则表达式。我知道我可以写bla,但实际的正则表达式更复杂。

pw136qt2

pw136qt21#

使用负查找:x1月0n1x * x1月1n1x * x1月2n 1x
正lookarounds可用于Assert模式匹配。负lookarounds则相反:它用于Assert模式不匹配。一些对后视等进行限制。

链接至regular-expressions.info

另请参阅

更多示例

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

vfwfrxfs

vfwfrxfs2#

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

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

(?!(?:m{2}|t)$)是负的lookahead;它表示“从当前位置开始,接下来的几个字符是 * 而不是 * mmt,后面是字符串的结尾。”开头的起始锚(^)确保在字符串的开头应用lookahead。如果成功,则.*继续使用字符串。
仅供参考,如果您使用的是Java的matches()方法,您实际上并不需要^和最后的$,但它们不会造成任何损害。

bxgwgixi

bxgwgixi3#

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

这是针对给定正则表达式的。
\B用于查找字边界。
这里使用正前瞻(?=\w)是为了避免空格。
对原始正则表达式的否定前瞻是为了防止它的匹配。
最后的(\w*)用于捕获剩下的所有单词。
将保持这些字的组是组3。
简单(?!模式)将不起作用,因为任何子字符串都将匹配
简单的^(?!(?:m{2}| t)$).*$将不起作用,因为它的粒度是整行

tnkciper

tnkciper4#

此正则表达式计算您的条件:

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

看看它是如何工作的:https://regex101.com/r/Ryg2FX/1

70gysomp

70gysomp5#

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

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

相关问题