replaceAll で気をつけること

2010年04月10日 15時16分 Java



※対象バージョン:Java1.4

Java の String クラスには置換メソッドとして replaceAll() メソッドが用意されています。文字列に指定した文字列が存在した場合に、指定した別の文字列に置換を行います。replaceAll() は内部で正規表現を行い、置換処理を実現しています。このため指定する置換文字列も正規表現を意識した形で指定しなければ、予期せぬ動作をしてしまうことがあります。

// replaceAll() の実装
public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

 
よくやりがちな失敗が文字列として「\」を渡す場合です。文字列で「\」を扱う場合、「\\」としエスケープ処理を行う必要があります。

// "C:\\Java"; を "C:/Java" に変換(誤り)
String path = "C:\\Java";
path.replaceAll("\\", "/");

 
これは誤りです。”C:\\Java” とエスケープした「\」は、正規表現で処理される際に「\」として扱われてしまい、正規表現上のエスケープ文字と扱われます。このため正規表現時に再度「\」にエスケープさせる必要があるため、正規表現処理の段階で「\\」となっている必要があります。

// "C:\\Java"; を "C:/Java" に変換(正しい)
String path = "C:\\Java";
path.replaceAll("\\\\", "/");

 

String
boolean replaceAll (String regex, String replacement)
          指定された正規表現に一致する、この文字列の各部分文字列に対し、指定された置換を実行します。


Leave a Reply

preload preload preload