2016-11-16 40 views
0

文字列をコンマで区切る正規表現を探しています。非常に簡単ですが、別の制限があります。文字列のパラメータには、その文字列を分割してはならない括弧で囲まれたカンマを使用できます。パラメータを分割する正規表現

例:

1, 2, 3, add(4, 5, 6), 7, 8 
^^^  ! ! ^^ 

文字列が唯一^が付いカンマで分割されるべきではないと!。

私はここでそれのための解決策を見つけた:A regex to match a comma that isn't surrounded by quotes

正規表現:

,(?=([^\(]*\([^\)]*\))*[^\)]*$) 

しかし、私の文字列は、より複雑な可能性:この文字列の

1, 2, 3, add(4, 5, add(6, 7, 8), 9), 10, 11 
^^^  ! !  ! ! ! ^^

を結果間違っていると私はこれを修正するための手がかりを持っていないか、それが可能であっても正規表現。

誰もがこの問題を解決する方法を知りましたか?

ありがとうございました!

+1

忘れないように、 '、(?=([^ \]] * \([^ \)] * \))* [^ \それは最後の手段である。 –

+0

はかっこのみをエスケープしていますか、またはキーワードadd(...)を使用していますか? –

+0

@LoicM。 「追加」は単なる例であり、他のものであってもよい。要点は、括弧内のコンマは文字列を分割しないことです! –

答えて

0

ます。また、この正規表現を使用してこれを達成することができます([^,(]+(?=,|$)|[\w]+\(.*\)(?=,|$))このテキスト1, 2, 3, add(4, 5, add(6, 7, 8), 9), 10, 11を考慮

regex online demo

それはに基づいてグループを作成し、カンマ(()に囲まれていない)

したがって、outp ut:は次のようになります:

Match 1 
Group 1. 0-1 `1` 

Match 2 
Group 1. 2-4 ` 2` 

Match 3 
Group 1. 5-7 ` 3` 

Match 4 
Group 1. 9-35 `add(4, 5, add(6, 7, 8), 9)` 

Match 5 
Group 1. 36-39 ` 10` 

Match 6 
Group 1. 40-43 ` 11` 
+1

私はregExソリューションを頼んだので、あなたの答えは私のテストでかなり良く見えます。だから私は正しい答えとしてあなたの投票をします。しかし、私のテストでは、私が答えとして投稿したJavaメソッドがこれよりも少し速いことも示しています。したがって、私は文字列を解析するためにjavaメソッドを使用します。 –

+0

黒い魔法。私はタオルを投げ込んだときに再帰的なパターンでこれを達成しようとしていました。ブラボー –

2

[OK]を私は正規表現は非常に有用ではないと思う。 Javaの小さなブロックが簡単かもしれません。

だから、これは問題を解決するための私のJavaコードです:

public static void splitWithJava() { 
    String EXAMPLE = "1, 2, 3, add(4, 5, add(7, 8), 6), 7, 8"; 
    List<String> list = new ArrayList<>(); 
    int start = 0; 
    int pCount = 0; 
    for (int i = 0; i < EXAMPLE.length(); i++) { 
     char c = EXAMPLE.charAt(i); 
     switch (c) { 
     case ',': { 
     if (0 == pCount) { 
      list.add(EXAMPLE.substring(start, i).trim()); 
      start = i + 1; 
     }; 
     break; 
     } 
     case '(': { 
     pCount++; 
     break; 
     } 
     case ')': { 
     pCount--; 
     break; 
     } 
     } 
    } 
    list.add(EXAMPLE.substring(start).trim()); 
    for (String str : list) { 
     System.out.println(str); 
    } 
    }