2011-07-26 9 views
3

同じタイプの開閉括弧が同数のコンマ区切りのコンマ区切りに一致する正規表現をカンマで区切ります。例えばC#正規表現の一致

...

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

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

私はC#.NETとの事前のための

おかげで働いています!ネストされた括弧がない場合

+5

を芋、解析関数を記述する方が良いだろう。 –

+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

OPは実際に括弧で囲まれていないコンマで分割する方法を尋ねましたが、これは間違いなく良いアプローチです。 –

+0

ありがとうございます。パターンでは、シーケンスをコンマで区切る必要はありません。 (?<=^|、\ s *)(?:\ {[^}] * \} | \([^)] * \)|カンマ区切りが重要な場合は、 \ [[^ \]] * \])\ s *)+(?= \ s *(?:、| $)) 'を返します。 – drf

+0

私は実際に一般的な観察をしていました。それは彼らがやっている、分割している、ということで、人々は 'Split()'に固執する傾向がありますか?しかし、必要な分割正規表現が非常に複雑であることが判明したこのような場合には、通常は 'Matches()'アプローチを実装する方がはるかに簡単です。 –