2011-07-30 5 views
0

これは重複した投稿だとは言えますが、異なっています。複数の区切り文字を使用するJavaの文字列解析またはsplit()バグ

私は、ユーザーによって指定された区切り記号を削除する何らかの種類の作業に取り組んでいるプログラムに取り組んでいます。区切り文字が単一の文字(特殊文字かどうか)であれば、私のプログラムは動作しています。ただし、ユーザー入力が文字列の場合、メッセージ文字列から区切り文字のすべての文字が削除されます。

ex。文字列メッセージ= "ab \ nc [d] e {fMardk1g(h)i} j"; 出力はbcefghij ですが、期待される出力はabcdefghij

です。私はPatternクラスを初めて使用するので、どこに問題があるのか​​分かりません。

ここで問題のコード(私はそう、私は問題を特定することができ、テストクラスにそれを置く)です:

輸入java.util.regex.Patternのは、

public class ParsingTest { 
    public static void main(String[] args) { 
     String[] delimiters = { "Mardk1", "\n", "[", "]", "{", "}", "(", ")" }; 
     StringBuilder regexp = new StringBuilder(""); 
     regexp.append("["); 
     for(String s : delimiters) { 
      regexp.append("["); 
      regexp.append(Pattern.quote(s)); 
      regexp.append("]"); 
     } 
     regexp.append("]"); 

     String message = "ab\nc[d]e{fMardk1g(h)i}j"; 
     StringBuilder result = new StringBuilder(""); 
     String[] a = message.split(regexp.toString()); 
     for(String string : a) { 
      result.append(string); 
     } 
     System.out.println(result); 
     for(String str: a) System.out.print(str); 
     System.out.println(); 
    } 
} 
+0

あなたの生成された正規表現は '[Mardk1]'文字のいずれかで区切ります 'M、R、D、Kまたは1が含まれています:

正規表現を構築する代わりにこれを試してみてください'これがあなたの出力に' a'文字が表示されない理由です。 – rodion

答えて

1

誤った種類のグループ化構造を使用しています。任意の1文字x、y、zにマッチする[xyz]のようなパターンを作成しています。いくつかの完全な文字列のいずれかと一致するので、通常の()スタイルグループと、交替演算子(|)が必要です。詳細については、Patternのドキュメントをご覧ください。

for(String s : delimiters) { 
    // We don't want to start with (| 
    if (regexp.length() > 1) 
    { 
     regexp.append("|"); 
    } 
    regexp.append(Pattern.quote(s)); 
} 
+0

ああ、tnx ...あなたは私の問題を解決しました。なぜ、 "|"単語の間にある – JinShin

+0

@ JinShin:これは、それが(または)それにマッチすると言う代替演算子です。だから "(ab | cd | ef)"は "ab"、 "cd"、 "ef"と一致します。 –

+0

oh、tnxもう一度。わかった。 – JinShin