了解否定字符 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)
因为撇号不是 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]/
正则表达式:
/''+[^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)
因为撇号不是 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]/