2011-07-26 63 views
3

我想要一個正則表達式,它將匹配逗號之間的相同類型的開放和關閉括號的等量分隔逗號短語 。C#正則表達式匹配

例如...

{abc} (def), [ghi], (jkl, mno) 
----------------------------- 
the match should be: 

{abc} (def) 
[ghi] 
(jkl, mno) 

我與C#的工作。淨

感謝提前!

+5

IMO倒不如寫一個解析函數。 –

+0

正則表達式在這裏是一個糟糕的選擇,你想要的是一個簡單的狀態機解析器。 –

+1

我擔心含有嵌套括號的短語是CFG(Chomsky 2),正則表達式是規則的(Chomsky 3)(因此是REGex)。你不能用正則語法解析CFG。 – Hyperboreus

回答

3

如果沒有嵌套的支架,你可以使用:

((?:\{[^}]*\}|\([^)]*\)|\[[^\]]*\])\s*)+ 

string test = "{abc} (def), [ghi], (jkl, mno)"; 
string pattern = @"((?:\{[^}]*\}|\([^)]*\)|\[[^\]]*\])\s*)+"; 
foreach (Match m in Regex.Matches(test, pattern)) 
    Console.WriteLine(m.Value); 

此打印:

{abc} (def) 
[ghi] 
(jkl, mno) 
+0

該操作系統實際上問如何分割逗號不括括號括起來,但這絕對是一個更好的方法。 –

+0

謝謝,模式並不要求用逗號分隔序列。 OP,如果逗號刪除很重要,可以使用替代模式'(?<=^|,\ s *)((?:\ {[^}] * \} | \([^)] * \) \ [[^ \]] * \])\ s *)+(?= \ s *(?:,| $))',它返回相同的輸出。 – drf

+0

我真的在做一個普遍的觀察。人們傾向於注意'Split()',因爲他們在做,分裂,對吧?但在這種情況下,所需的分割正則表達式變得非常複雜,通常'Matches()'方法更容易實現。 –