哪个正则表达式运算符表示“不”匹配此字符?


Answers:


88

您可以使用否定字符类来排除某些字符:例如,[^abcde]将匹配除a,b,c,d,e之外的任何字符。

您可以在字符类内部使用简写形式,而不必按字面意义指定所有字符:([\w]小写)将匹配任何“单词字符”(字母,数字和下划线),[\W](大写)将匹配单词字符以外的任何字符;同样,[\d]将匹配0-9数字,而[\D]匹配除0-9数字以外的任何数字,依此类推。

如果您使用PHP,则可以查看正则表达式字符类文档


80

说“不匹配”有两种方法:字符范围和零宽度负向前/后向。

前者:不匹配abc0[^a-c0]

后者:匹配除foo和以外的任何三个字母的字符串bar

(?!foo|bar).{3}

要么

.{3}(?<!foo|bar)

另外,还为您提供了一个更正:*?并且+实际上不匹配任何内容。它们是重复运算符,并且始终遵循匹配运算符。因此,a+方法相匹配的一种或多种a[a-c0]+方法相匹配的一种或多种abc或者0,同时[^a-c0]+将匹配一个或多个的任何不是abc0


^((?!foo).)+$匹配不包含foo的任何行regex101.com/r/z6a65l/4
Levi Baguley

48

[^] (在[]中)是正则表达式中的否定,而是^“字符串开头”

[^a-z] 匹配任何不是从“ a”到“ z”的单个字符

^[a-z] 表示字符串以“ a”到“ z”开头

参考


8

^ 用于字符范围的开头,或否定先行/后向断言。

>>> re.match('[^f]', 'foo')
>>> re.match('[^f]', 'bar')
<_sre.SRE_Match object at 0x7f8b102ad6b0>
>>> re.match('(?!foo)...', 'foo')
>>> re.match('(?!foo)...', 'bar')
<_sre.SRE_Match object at 0x7f8b0fe70780>

您是否必须?!在最后两个示例中使用,还是可以单独使用!?在那里做什么?
点击Upvote 2011年

Python需要使用?,以告知它是扩展。其他正则表达式引擎可能有自己的规则。
伊格纳西奥·巴斯克斯

@Click:这很标准。regular-expressions.info/refadv.html,大多数regexp引擎手册也说同样的话。
阿玛丹(Amadan)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.