2012-02-16 12 views
1

"a、b、c、d"という形式の文字列があります。 "a(b、c、d)" 私はしたいです「」に分割するか「」私は、私が遭遇したときの分割を終了したい 『(』第二のフォーマットで。 これは私がハッキングを開始する前に、私が持っていたものである。Javaで正規表現を書く。 string.split()メソッドの使用'('

String [] stringArray = string.split(", |,"); 

最初の列フォーマットが含まれています: 'A'、 'B'、 'C​​'、 'D' 第二のフォーマットのアレイは '(B、C、D)'

例conaintなる:

String string1 = "ab,cd, de"; 
String string2 = "ab(de,ef); 
String [] array1 = string1.split(...); 
String [] array2 = string2.split(...); 

array1 result: ["ab" "cd" "de"] 
array2 result: ["ab(de,ef)"] 

コンマの間の文字数に制限はありません。私はこれがより明確であることを望む。

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

+0

はそうあなたが他の言葉で、有効な出力の例を提供することができ、有効な 'stringArray'分割後「、B、C、D(E、 f、g) " – ggreiner

+0

、それが') 'の後に再起動するかどうかは、abcd(e、f、g)のように' 'a、b、c、d(e、f、g)h、 ? – ShinTakezou

+0

ありがとうございます。私は私の質問を言い換える必要があります。編集を参照してください。 – Dale

答えて

1

をチェックして、彼らは他の括弧の中にネストすることはないだろう、これは動作します:

String[] result = source.split(",\\s*(?![^()]*\\))"); 

先読みが最初(を見ることなく)を見つけた場合、それは括弧のペア内でなければなりませんが、この文字列を考える:。

を0

... resultは次のようになります。

["ab", "cd", "de", "ef(gh,ij)", "kl", "mn"] 
+0

パーフェクト。 – Dale

0

あなたが必要と考えるものは、ネガティブなビヘイビアです。ドキュメントによると、Javaの正規表現は多かれ少なかれPerlの正規表現のようなものです。可変長のlookbehindはPerlで実装されていないので、(?<!\(.*),\s*は機能しません(コンマに続けてスペースを入れたり空白を入れず、先行する文字は(となります。 (によって)。

私が前に付加(,の最初を分割して、最終的な配列に2つ目を追加し、最も簡単な方法は、最初の(発生時に分割する(あなたがそうするように正規表現を避けることができます)と違っ得られた二つのセグメントを処理することであると信じておそらく失われた()。

EDIT

"(B、D)" "(B、D)" を与える必要があり、あなたは「最初から最後splited文字列に(付属)(の後に来るものは何でも追加する必要がありますので、 "セグメント。しかし、そのコンセプトはこれまでに書かれたとおりです。

0

indexOf()メソッドを使用します。 。

最初に、文字列は「(」がある場合は、括弧は、常に適切にバランスしている知っている場合

index = string.indexOf('('); 

    if(index ==-1) // it means there is no '(' 
     { 
     string.split(...); 
     } 
    else 
     { 
     subString = string.subString(0,index); // the part of the string before the '(' 

     // now do the following- 
     // 1. proceed with split on substring 

     // array1 = substring.split(...) 

     // 2. Create a new array, insert the elements of array1 in it, 
     // followed by the remaining part of the string 

     // array2 = combine(array1, string.subString(index+1)); // <-- you will need to write this method 
     }