例如,我有一个正则表达式(ma|(t){1})
。它匹配ma
和t
不匹配bla
。
我想否定正则表达式,因此它必须匹配bla
而不是ma
and t
,通过在这个正则表达式中添加一些东西。我知道我可以写bla
,但是实际的正则表达式更复杂。
例如,我有一个正则表达式(ma|(t){1})
。它匹配ma
和t
不匹配bla
。
我想否定正则表达式,因此它必须匹配bla
而不是ma
and t
,通过在这个正则表达式中添加一些东西。我知道我可以写bla
,但是实际的正则表达式更复杂。
使用否定环视:(?!
pattern
)
积极的环顾四周可用于断言模式匹配。否定的环视则相反:它用于断言模式不匹配。一些风格支持断言;有些限制了lookbehind等。
这些是尝试提出玩具问题的正则表达式解决方案作为练习;如果您尝试学习可以使用环视的各种方式(嵌套它们、使用它们捕获等),它们应该具有教育意义:
假设您只想禁止与正则表达式完全匹配的字符串(即,mmbla
可以,但mm
不是),这就是您想要的:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
是负前瞻;它说“从当前位置开始,接下来的几个字符不是 mm
or t
,然后是字符串的结尾。” 开头的起始锚 ( ^
) 确保在字符串的开头应用前瞻。如果成功,则.*
继续并消耗字符串。
仅供参考,如果您使用 Java 的matches()
方法,则实际上并不需要 the^
和 final $
,但它们不会造成任何伤害。不过,$
内部的前瞻是必需的。
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
这是给定的正则表达式。
\b 是查找单词边界。
积极向前看 (?=\w) 是为了避免空格。
对原始正则表达式的负面展望是为了防止它的匹配。
最后 (\w*) 是捕获所有剩下的单词。
包含单词的组是第 3 组。
简单的 (?!pattern) 将不起作用,因为任何子字符串都将匹配
简单的 ^(?!(?:m{2}|t)$).*$ 将不起作用,因为它的粒度是全行
如果你使用 laravel,应用这个。
Laravel 有一个 not_regex where 被验证的字段不能匹配给定的正则表达式;在内部使用 PHPpreg_match
函数。
'email' => 'not_regex:/^.+$/i'