了解否定字符 class

Understanding the negated character class

正则表达式:

/''+[^f]/g

应用于字符串时:

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

也匹配do'''f中的三个撇号。为什么 [^f] 不排除它?

fiddle 是 here

PS:我想找到连续的两个或更多撇号后跟一个非 f。

一旦在 2 或更多 ' 后发现 f+ 就会使正则表达式引擎回溯。您可以在否定前瞻中使用 ' 替代项来阻止(以免消耗除 f' 以外的字符,当您使用 [^f] 时,该字符成为一部分匹配,因为否定字符 class 是一个 consuming 模式,前瞻是零宽度断言)。

''+(?!['f])

regex demo。此处,如果 2 个或更多 ' 符号后跟 f'(?!['f]) 将阻止匹配。此外,您可以使用限制量词 {2,}(出现 2 次或更多次)来编写它:'{2,}(?!['f]).

如果您的正则表达式引擎支持 占有量词 以防止回溯到量化模式,请使用一个:

''++(?!f)
  ^^

参见another demo(另一种写法是'{2,}+(?!f))。

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

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

参见.NET regex demo

因为撇号不是 f 的字符。

示例正则表达式匹配 "At least 2 apostrophes followed by a character that's not an f"。

你看,最后一场比赛确实不包括 f 但撇号。所以如果你想排除最后一场比赛,你可能更喜欢这个正则表达式

''+[^'f]

您只需要一个 atomic group 这样正则表达式就不会回溯到撇号,而撇号不是 'f':

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

你可以玩它here

如果您的引擎支持 possessive quantifiers,那么您也可以使用它们:

/''++[^f]/

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

/''+[^'f]/