web-dev-qa-db-ja.com

Javaのsplit()メソッドは、ドット(。)では機能しません。

エラー部分をWebアプリケーションから分離するために、簡単なコードスニペットを用意しました。

public class Main {

    public static void main(String[] args) throws IOException {
        System.out.print("\nEnter a string:->");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String temp = br.readLine();

        String words[] = temp.split(".");

        for (int i = 0; i < words.length; i++) {
            System.out.println(words[i] + "\n");
        }
    }
}

WebアプリケーションJSFの構築中にテストしました。上記のコードでtemp.split(".")が機能しない理由を知りたいだけです。声明、

System.out.println(words[i]+"\n"); 

コンソールに何も表示されないということは、ループを通過しないことを意味します。 temp.split()メソッドの引数を他の文字に変更すると、通常どおり正常に機能します。何が問題なのでしょうか?

169
Bhavesh

Java.lang.String.split は正規表現で分割され、正規表現の.は「任意の文字」を意味します。

temp.split("\\.")を試してください。

426
rob mayoff

split()のドキュメント は次のとおりです。

この文字列を、指定された正規表現の一致で分割します。

(エンファシス鉱山。)

ドットは、正規表現構文の特殊文字です。リテラル文字列パターンに分割する場合は、split()のパラメーターで Pattern.quote() を使用します。

String[] words = temp.split(Pattern.quote("."));
60
millimoose

試してください:

String words[]=temp.split("\\.");

メソッドは次のとおりです。

String[] split(String regex) 

「。」正規表現の予約文字です

9
ysrb

メソッドは文字列ではなく正規表現を使用し、ドットは正規表現で特別な意味を持ちます。 split("\\.")のようにエスケープします。二重のバックスラッシュが必要です。2番目のバックスラッシュは最初のエスケープをエスケープします。

9
mbatchkarov

\\.は簡単な答えです。これがあなたの助けのための簡単なコードです。

while (line != null) {
    //             
    String[] words = line.split("\\.");
    wr = "";
    mean = "";
    if (words.length > 2) {
        wr = words[0] + words[1];
        mean = words[2];

    } else {
        wr = words[0];
        mean = words[1];
    }
}
5
Israr Khan

正常に動作します。 ドキュメント を読みましたか?文字列は正規表現に変換されます。

.は、すべての入力文字に一致する特殊文字です。

正規表現の特殊文字と同様に、\でエスケープします。 Java文字列エスケープ用に追加の\が必要です。

3
    private String temp = "mahesh.hiren.darshan";

    String s_temp[] = temp.split("[.]");

  Log.e("1", ""+s_temp[0]);
2
Hiren Patel