web-dev-qa-db-ja.com

String.splitでパイプ区切り文字をエスケープする必要があるのはなぜですか?

パイプで区切られた値を持つ各行を持つファイルを解析しようとしています。 splitメソッドでパイプ区切り文字をエスケープしないと正常に動作しませんでしたが、以下のようにパイプをエスケープすると正常に動作しました。

private ArrayList<String> parseLine(String line) {
    ArrayList<String> list = new ArrayList<String>();
    String[] list_str = line.split("\\|"); // note the escape "\\" here
    System.out.println(list_str.length);
    System.out.println(line);
    for(String s:list_str) {
        list.add(s);
        System.out.print(s+ "|");
    }
    return list;
}

誰かがsplit()メソッドのためにパイプ文字をエスケープする必要がある理由を説明できますか?

140
SK1

String.splitは、正規表現の引数を必要とします。エスケープされていない|は、「空の文字列または空の文字列」を意味する正規表現として解析されますが、これはあなたが言うことではありません。

175
Louis Wasserman

split のパラメーターの構文は正規表現であるため、「|」 ORの特別な意味と「\ |」リテラル '|'を意味しますしたがって、文字列「\\ |」正規表現「\ |」を意味しますつまり、文字「|」と完全に一致します。

76
dlamblin

これを簡単に行うことができます:

String[] arrayString = yourString.split("\\|");
6
Ravinath