我有一个正则表达式,例如(ma|(t){1})。它匹配ma和t,但不匹配bla。我想否定这个正则表达式,因此它必须匹配bla,而不是ma和t,通过添加一些东西到这个正则表达式。我知道我可以写bla,但实际的正则表达式更复杂。
(ma|(t){1})
ma
t
bla
pw136qt21#
使用负查找:x1月0n1x * x1月1n1x * x1月2n 1x正lookarounds可用于Assert模式匹配。负lookarounds则相反:它用于Assert模式不匹配。一些对后视等进行限制。
这些都是尝试拿出正则表达式解决玩具问题作为练习;如果您想学习使用lookaround的各种方法(嵌套它们、使用它们捕获等),它们应该是有教育意义的:
vfwfrxfs2#
假设您只想禁止与正则表达式完全匹配的字符串(例如,mmbla可以,但mm不行),那么您需要这样做:
mmbla
mm
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)是负的lookahead;它表示“从当前位置开始,接下来的几个字符是 * 而不是 * mm或t,后面是字符串的结尾。”开头的起始锚(^)确保在字符串的开头应用lookahead。如果成功,则.*继续使用字符串。仅供参考,如果您使用的是Java的matches()方法,您实际上并不需要^和最后的$,但它们不会造成任何损害。
(?!(?:m{2}|t)$)
^
.*
matches()
$
bxgwgixi3#
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
这是针对给定正则表达式的。\B用于查找字边界。这里使用正前瞻(?=\w)是为了避免空格。对原始正则表达式的否定前瞻是为了防止它的匹配。最后的(\w*)用于捕获剩下的所有单词。将保持这些字的组是组3。简单(?!模式)将不起作用,因为任何子字符串都将匹配简单的^(?!(?:m{2}| t)$).*$将不起作用,因为它的粒度是整行
tnkciper4#
此正则表达式计算您的条件:
^.*(?<!ma|t)$
看看它是如何工作的:https://regex101.com/r/Ryg2FX/1
70gysomp5#
如果您使用laravel,则应用此选项。Laravel有一个not_regex,其中要验证的字段必须与给定的正则表达式不匹配;在内部使用PHP preg_match函数。
preg_match
'email' => 'not_regex:/^.+$/i'
5条答案
按热度按时间pw136qt21#
使用负查找:x1月0n1x * x1月1n1x * x1月2n 1x
正lookarounds可用于Assert模式匹配。负lookarounds则相反:它用于Assert模式不匹配。一些对后视等进行限制。
链接至regular-expressions.info
另请参阅
更多示例
这些都是尝试拿出正则表达式解决玩具问题作为练习;如果您想学习使用lookaround的各种方法(嵌套它们、使用它们捕获等),它们应该是有教育意义的:
vfwfrxfs2#
假设您只想禁止与正则表达式完全匹配的字符串(例如,
mmbla
可以,但mm
不行),那么您需要这样做:(?!(?:m{2}|t)$)
是负的lookahead;它表示“从当前位置开始,接下来的几个字符是 * 而不是 *mm
或t
,后面是字符串的结尾。”开头的起始锚(^
)确保在字符串的开头应用lookahead。如果成功,则.*
继续使用字符串。仅供参考,如果您使用的是Java的
matches()
方法,您实际上并不需要^
和最后的$
,但它们不会造成任何损害。bxgwgixi3#
这是针对给定正则表达式的。
\B用于查找字边界。
这里使用正前瞻(?=\w)是为了避免空格。
对原始正则表达式的否定前瞻是为了防止它的匹配。
最后的(\w*)用于捕获剩下的所有单词。
将保持这些字的组是组3。
简单(?!模式)将不起作用,因为任何子字符串都将匹配
简单的^(?!(?:m{2}| t)$).*$将不起作用,因为它的粒度是整行
tnkciper4#
此正则表达式计算您的条件:
看看它是如何工作的:https://regex101.com/r/Ryg2FX/1
70gysomp5#
如果您使用laravel,则应用此选项。
Laravel有一个not_regex,其中要验证的字段必须与给定的正则表达式不匹配;在内部使用PHP
preg_match
函数。