了解否定字符类

3

正则表达式:

/''+[^f]/g

当应用于字符串时:

don't '''theater'''  but not'''d and not do'''f

还匹配do'''f中的三个撇号。为什么[^f]没有将其排除?

附注:我想找到连续两个或更多的撇号,后面不是f。


它匹配两个撇号和一个不是f的字符(第三个撇号)... - deceze
' 匹配第一个单引号,'+ 匹配第二个单引号,而 [^f] 则匹配第三个单引号... - kennytm
3个回答

3

+表示正则表达式引擎在发现2个或更多'后遇到一个f时会回溯一次。你可以通过在负向前瞻中添加一个'的选择项来防止这种情况的发生(这样可以避免消耗除f'之外的字符,使用[^f]时,该字符变为匹配的一部分,因为否定字符类是一种“消耗”模式,而前瞻则是零宽断言)。

''+(?!['f])

请参考正则表达式演示。在这里,(?!['f])将阻止匹配,如果有2个或更多的'符号后跟着f'。此外,您还可以使用限定量词{2,}(表示2次或更多出现)来编写它:'{2,}(?!['f])
如果您的正则表达式引擎支持贪婪量词,可以使用一个来防止回溯到被量化的模式中:
''++(?!f)
  ^^

请查看另一个演示(另一种编写方式是'{2,}+(?!f))。

如果您使用的是不支持占有量词的.NET正则表达式库,则可以改用原子组(其工作方式与占有量词相同,但适用于整个组):

(?>'{2,})(?!f)

查看.NET正则表达式演示


1
因为撇号是一个不是f的字符。
示例正则表达式匹配“至少2个撇号,后跟一个不是f的字符”。
see
你会发现,最后一个匹配实际上没有包括那个f,而是撇号。因此,如果你想排除最后一个匹配,你可能更喜欢这个正则表达式
''+[^'f]

0

你只需要一个原子组,这样正则表达式就不会回溯到撇号,而这个撇号不是“f”:

/(?>''+)[^f]/

你可以在这里进行试玩。

如果你的引擎支持所有格量词, 那么你也可以使用它们:

/''++[^f]/

如果你想接受任何既不是撇号也不是f的字符,那么你可以定义排除另一个字符:

/''+[^'f]/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接