HOWTO · Java
Java で文字列内の複数の文字を置換する方法
Java の文字列で複数の文字を置換する方法を、String.replaceAll()、String.replace()、String.replaceFirst() の使い分けとともに説明します。
このページの内容
Java では、正規表現の文字クラスを String.replaceAll() に渡すと、文字列全体から指定した複数の文字を置換できます。正規表現が不要な文字列そのものの置換には、String.replace() を連結して使います。正規表現に一致する最初の箇所だけを変える場合は String.replaceFirst() を使います。
Java で replaceAll() を用いて文字列中の複数の文字を置換する
String.replaceAll(regex, replacement) は、第 1 引数を正規表現として扱い、一致するすべての箇所を置換します。たとえば [_/] という文字クラスは、アンダースコアまたはスラッシュのどちらか 1 文字に一致します。_/ という 2 文字の並び全体に一致するわけではありません。
次のプログラムでは、アンダースコアとスラッシュをハイフンに置き換え、置換前後の文字列を表示します。
public class ReplaceAllChars {
public static void main(String[] args) {
String input = "j_u_s_t/a/s/t/r/i/n/g";
String result = input.replaceAll("[_/]", "-");
System.out.println("Input: " + input);
System.out.println("Result: " + result);
}
}
Input: j_u_s_t/a/s/t/r/i/n/g
Result: j-u-s-t-a-s-t-r-i-n-g
Java のソースコードでは、正規表現に渡すバックスラッシュも文字列リテラル内でエスケープする必要があります。たとえば "\\d" は正規表現 \d を渡し、数字に一致します。一致した部分を削除するには、置換文字列に "" を指定します。たとえば、"abcd12345efgh".replaceAll("\\d", "") は数字を取り除き、"s t r i n g".replaceAll(" ", "") は通常のスペースを取り除きます。また、"s t\\tr".replaceAll("\\s", "-") はスペースやタブを含む正規表現上の空白文字をハイフンに置換します。
これらの式は、数字を削除し、通常のスペースを削除し、スペースやタブを含む空白文字をハイフンに置換します。小文字の ASCII 英字だけを削除するには [a-z] を使います。Java の \p{Lower} は既定では ASCII 文字を対象とし、Unicode 文字クラスの動作を有効にした場合にのみ Unicode の小文字も含みます。
String.replace() を用いた文字列の複数文字の置換
String.replace(target, replacement) は正規表現ではなく、文字列そのものに一致します。各呼び出しは対象文字列のすべての出現箇所を置換し、新しい文字列を返します。Java の文字列は不変だからです。対象ごとに異なる置換を行う場合は呼び出しを連結できます。呼び出しは左から順に適用されるため、先に行った置換でできた文字列が、後続の呼び出しの対象になることがあります。
たとえば、"javbjavcjadakavajavc" に対して input.replace("b", "a").replace("c", "a").replace("d", "v").replace("k", "j") を実行すると、javajavajavajavajava になります。対象が文字列そのもので、置換ごとに個別の呼び出しに分けると分かりやすい場合は replace() を選びます。まとめて指定できる正規表現がある場合は replaceAll() を使います。
Java で String.replaceFirst() を使って文字列内の複数の文字を置換する
String.replaceFirst(regex, replacement) も正規表現を受け取りますが、1 回の呼び出しで置換するのは最初に一致した箇所だけです。呼び出しを繰り返すと、前の呼び出しが返した文字列に対して、次の正規表現検索が行われます。変更する数や順序を意図的に決めたい場合に使えます。
たとえば、"This is a sample string.".replaceFirst("i", "1").replaceFirst("s", "2") は Th12 is a sample string. を返します。最初の呼び出しでは This の i が変わります。次の呼び出しは更新後の文字列を対象にするため、最初に見つかる s、つまり This の s が変わります。最初の一致だけを置換するなら replaceFirst() を使い、すべての一致を置換するなら replaceAll() を使います。
まとめ
複数の文字をまとめて置換するには、正規表現の文字クラスと String.replaceAll() を使うと、一致するすべての箇所を変更できます。正規表現を使わない個別の置換には String.replace() の連結を使い、各呼び出しで最初の正規表現一致だけを変更する場合は String.replaceFirst() を選びます。