2012-03-21 16 views
140

パイプで区切られた値を持つ各行を持つファイルを解析しようとしています。 splitメソッドでパイプ区切り文字をエスケープしなかった場合、正しく機能しませんでしたが、以下のようにパイプをエスケープした後は正常に機能しました。String.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()方法のためにエスケープする必要がありますなぜ誰かが説明していただけますか?

+13

答えは以下の答え、「なぜ、」しかし、あなたはリテラル文字列に一致するようにしようとしている場合だけFYI、あなたはまた、([Pattern.quote]で見えるかもしれませんhttp://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#quote(java.lang.String))。それは 'String'を受け取り、入力にマッチする正規表現' String'を返します(つまり、あなたのためにすべてのエスケープ処理を行います)。 – yshavit

+0

+1 for 'Pattern.quote' – redDevil

答えて

175

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

76

splitへのそのパラメータの構文は正規表現であるため、 '|' ORの特別な意味を持ち、 '\ |'リテラル '|'文字列 "\\ |"正規表現 '\ |'を意味しますこれは正確に '|'という文字に一致することを意味します。

+1

この説明をありがとう。私はほとんど常にダブルエスケープを使用することを忘れています。なぜそれがそのようなのか分かっているので、今から私が覚えているでしょう。 – sufinawaz

+0

String行の値にPipe文字が含まれているとどうなりますか?エスケープされたパイプを分割せずにどのように分割することができますか? ? – AlexandreJ

+0

@AlexandreJ 'Some |、Delimited | Text | With | \ |埋め込み|パイプ| Char'を'( "Some"、 "Delimited"、 "Text"、 "With"のように分割する方法を尋ねていますか? "、"埋め込み "、"パイプ "、"文字 ")'? split関数はこのようなエスケープをサポートしていませんが、この場合に有効な正規表現を作ることができます。例えば、ゼロ幅のネガティブアサーションルックバックグループのようにすることができます。 '(?<!\\)\ | 'これは' line.split( "(?<!\\\\)\\ |"); ' – dlamblin

6

あなたは、単にこれを行うことができます。

String[] arrayString = yourString.split("\\|"); 
+0

正規表現であるyourString.split(" \\ | ")"を使用するために\をエスケープする必要があります。これは正しい数式です。 – mautrok

関連する問題