哪个正则表达式运算符意味着"不要"匹配此字符?

Cli*_*ote 73 regex

*, ?, +字符都意味着匹配这个字符.哪个字符意味着'不'匹配这个?例子会有所帮助.

Pao*_*fan 69

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

您可以在字符类中使用字而不是指定所有字符:( [\w]小写)将匹配任何"字符"(字母,数字和下划线),[\W](大写)将匹配除字词之外的任何内容; 同样,[\d]匹配0-9位数字,[\D]但匹配0-9位数字以外的任何数字,依此类推.

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


Ama*_*dan 66

有两种方式可以说"不匹配":字符范围和零宽度负向前瞻/后视.

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

后者:匹配任何三个字母的字符串,除了foobar:

(?!foo|bar).{3}

要么

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

另外,对于您的修正:*,?+实际上并不匹配任何内容.它们是重复运算符,并且始终跟随匹配的运算符.因此,a+可以匹配的一种或多种a,[a-c0]+意味着比赛的一种或多种a,b,c或者0,同时[^a-c0]+将匹配一个或多个的任何不是a,b,c0.

  • `^((?!foo).)+$` 匹配任何不包含 foo 的行 https://regex101.com/r/z6a65l/4/ (5认同)

diE*_*cho 35

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

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

^[a-z] 表示字符串从"a"到"z"开头

参考


Ign*_*ams 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>
Run Code Online (Sandbox Code Playgroud)