Javaの正規表現による文字列の置換について
Javaでは、正規表現を用いて文字列を置換する方法が豊富に用意されています。このページでは、正規表現を使った文字列置換の基本から応用例までを詳しく解説します。
基本的な置換メソッド
Javaでは、文字列の置換に主に以下のメソッドを使用します。
String.replaceAll(String regex, String replacement)
: 正規表現に一致する部分をすべて置換します。String.replaceFirst(String regex, String replacement)
: 正規表現に一致する最初の部分だけを置換します。Pattern.matcher(CharSequence input).replaceAll(String replacement)
: 高度なマッチングと置換に使用されます。
例えば、以下のコードでは replaceAll
を使って文字列内の数字をアスタリスクに置換します。
String input = "abc123xyz";
String result = input.replaceAll("\\d", "*");
System.out.println(result); // 出力: abc***xyz
簡単な例
以下に、正規表現を使用した基本的な文字列置換の例を示します。
特定の文字を置換
String input = "hello world";
String result = input.replaceAll("o", "0");
System.out.println(result); // 出力: hell0 w0rld
単語全体を置換
String input = "The cat sat on the mat.";
String result = input.replaceAll("\\bcat\\b", "dog");
System.out.println(result); // 出力: The dog sat on the mat.
複数の空白を1つに置換
String input = "This is a test.";
String result = input.replaceAll("\\s+", " ");
System.out.println(result); // 出力: This is a test.
高度な置換
正規表現では、バックリファレンスや条件を用いて高度な置換が可能です。
文字の順序を入れ替える
以下の例では、マッチした文字列の順序を逆にします。
String input = "John Doe";
String result = input.replaceAll("(\\w+) (\\w+)", "$2 $1");
System.out.println(result); // 出力: Doe John
文字列に番号を付ける
次の例では、各単語の前に番号を追加します。
String input = "apple orange banana";
String result = input.replaceAll("(\\w+)", "$0(1)");
System.out.println(result); // 出力: apple(1) orange(1) banana(1)
条件付き置換
Javaの標準ライブラリでは条件付き置換がサポートされていませんが、Matcher.appendReplacement
を使えば実現可能です。
例: 偶数と奇数の区別
import java.util.regex.*;
String input = "123 456 789";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(input);
StringBuffer result = new StringBuffer();
while (matcher.find()) {
int num = Integer.parseInt(matcher.group());
String replacement = (num % 2 == 0) ? "even" : "odd";
matcher.appendReplacement(result, replacement);
}
matcher.appendTail(result);
System.out.println(result.toString()); // 出力: odd even odd
便利な正規表現パターンの例
以下は、よく使用される正規表現パターンの例です。
\\d
: 任意の数字\\w
: 英数字およびアンダースコア\\s
: 任意の空白^
: 行の先頭$
: 行の末尾[a-z]
: 小文字アルファベット
例: メールアドレスのマスキング
String input = "myemail@example.com";
String result = input.replaceAll("(?<=.).(?=.*@)", "*");
System.out.println(result); // 出力: m*****l@example.com
パフォーマンス向上のためのヒント
正規表現を多用する際のパフォーマンスを向上させる方法を以下に示します。
- 頻繁に使用する正規表現は
Pattern.compile
を使って事前にコンパイルする。 - 正規表現の複雑さを可能な限り抑える。
- 正規表現を利用しなくても良い場合は
String.replace
を使用する。
事前コンパイルの例
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("abc123xyz");
String result = matcher.replaceAll("*");
System.out.println(result); // 出力: abc*xyz