2017-04-06 40 views
3

正则表达式:了解否定字符类

/''+[^f]/g 

当应用于字符串:

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

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

小提琴是here

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

+0

它匹配*两个撇号*和一个不是'f'的字符(第三个撇号)... – deceze

+0

''匹配第一个撇号,'+'匹配第二个,'[^^f]'匹配第三个... – kennytm

回答

3

+使一个f在2个或更多的'之后被找到后使正则表达式引擎回溯。你可以用'替代负先行防止(以免消耗比f'以外的文字,当您使用[^f],性格成为比赛的一部分,因为一个否定的字符类是消费模式和向前看符号是零宽度断言)。

''+(?!['f]) 

regex demo。这里,(?!['f])将防止匹配,如果2个或更多'符号跟在f'之后。另外,您可以使用限制量词{2,}(2次或更多次出现次数)编写它:'{2,}(?!['f])

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

''++(?!f) 
    ^^ 

another demo(写作的另一种方式是'{2,}+(?!f))。

如果您使用的是不支持的占有欲量词一个.NET regex库,你可以使用,而不是原子团(即以同样的方式作为占有欲量词,但整个组):

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

查看.NET regex demo

1

,因为那一撇是不是一个f一个字符。

示例正则表达式匹配“至少有2个撇号,其后跟一个而不是f”。
see
你看,最后一场比赛确实没有包括那个f,而是撇号。所以,如果你要排除的最后一场比赛,你可能更喜欢这个表达式

''+[^'f]
0

所有你需要的是一个atomic group所以正则表达式将无法回溯到一个单引号,这是不是一个“F”:

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

你可以玩它here

如果你的引擎支持possessive quantifiers,那么你可以使用他们太:

/''++[^f]/ 

如果你想接受的任何字符既不撇号,也不是F,则可以定义排除只是另一个角色:

/''+[^'f]/