2017-04-06 54 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]/