2013-10-09 19 views
0

我們遇到了這個正則表達式的一些問題。紡紗正則表達式有一個小錯誤

/\(\((((?>[^\(\(\)\)]+)|(?R))*)\)\)/x 

它用於「旋轉」文本。當我們有一句像「((我們((愛的樣子))這件襯衫(尺碼爲xl)))」的句子時,他不能執行這個權利。由於句子末尾有三個括號(因爲最後三個括號中的第一個括號屬於文本本身)。

它需要如何工作:正則表達式需要得到前2個括號,如果它有3個或更多的開始,結束最後2個,當它有3個或更多的括號。那可能嗎??? ((((襯衫|毛衣))))「效果很好(見最後4個圓括號?)。所以只有屬於文本中的括號纔會出現錯誤,在旋轉OR的起始括號後面開始,在結束括號之前結束。

回答

1

那麼首先,你不需要轉義字符類中的括號,並且在角色類中多次使用同一個字符沒什麼用處;因此,您正則表達式可以變成這個樣子沒有任何功能改變:

\(\((((?>[^()]+)|(?R))*)\)\) 

我不完全知道爲什麼你正在使用的原子團要麼;我可能是錯的(如果是的話,請糾正我),但我沒有發現與使用標準的非捕獲組不同的地方。

這就是說,你現在可以通過在正則表達式的內捕獲另一種可能允許在正則表達式嵌套單支架字符串:

\(\(((?:[^()]|((?R))|(\((?:[^()]|(?3))*\)))*)\)\) 
    1   2  3 

捕獲組:
1 - 得到最外層之間的第一次大賽((...))
2 - 獲取內部匹配和任何更多嵌套((...))
3 - 獲取單個parens之間的內容,以便在該組中允許遞歸。如果你不需要它,只需在數組中忽略它,它只是爲了允許嵌套單個parens。

regex101 demo

+0

你是我的英雄!最後一個正則表達式('\(\:\(((?:[^()] |((?R))|(\((?:[^()] |(?3))* \)))*) \)\)'),就像一個沙姆沙! –

+0

@ErikVandeVen我只是想幫助^^;我很高興它爲你工作:) – Jerry