【Java】MatcherクラスのappendReplacement()メソッドの使い方とサンプルコード
java.util.regex.Matcherクラスは、正規表現によるさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使ってMatcherオブジェクトを取得します。
appendReplacement()メソッドとは
MatcherクラスのappendReplacement()メソッドは、StringBufferオブジェクトと置換文字列(String)を引数として受け取ります。このメソッドは、入力データをStringBufferオブジェクトへ追加していく際に、マッチした内容を指定した置換文字列に置き換えて追加します。
内部的な動作としては、このメソッドは入力文字列を1文字ずつ読み取りながらバッファへ追加していき、マッチが発生した箇所では、マッチした部分の代わりに置換文字列をバッファへ追加します。その後、マッチした部分文字列の次の位置から処理を続けます。
実際のプログラムでは、find()メソッドと組み合わせてwhileループで繰り返し呼び出し、すべてのマッチを順に置換するのが一般的です。ループの後にはappendTail()メソッドを呼び出し、最後のマッチ以降の残りの文字列をバッファへ追加します。なお、Java 9以降ではStringBuilderを引数に取るオーバーロード版も提供されています。
使用例1:HTMLの太字タグを置換する
次の例では、正規表現「<b>(\S+)</b>」を使ってHTML文字列中のbタグにマッチさせ、マッチした部分全体を「BoldData」という文字列に置き換えています。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AppendReplacementExample {
public static void main(String[] args) {
String str = "<p>This <b>is</b> an <b>example</b> HTML <b>script</b>.</p>";
// bタグの内容にマッチする正規表現
String regex = "<b>(\\S+)</b>";
System.out.println("Input string: \n"+str);
// Patternオブジェクトの生成
Pattern pattern = Pattern.compile(regex);
// 文字列に対してコンパイル済みパターンでマッチング
Matcher matcher = pattern.matcher(str);
// 空のStringBufferを作成
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "BoldData");
}
matcher.appendTail(sb);
System.out.println("Contents of the StringBuffer: \n"+ sb.toString());
}
}
実行結果
Input string: <p>This <b>is</b> an <b>example</b> HTML <b>script</b>.</p> Contents of the StringBuffer: <p>This BoldData an BoldData HTML BoldData.</p>
実行結果から、<b>~</b>で囲まれた部分がタグごとすべて「BoldData」に置き換えられていることが分かります。appendReplacement()はタグの中身だけでなく、マッチした範囲全体を置換対象とする点に注意してください。
使用例2:文字列から特殊文字を削除する
次の例では、ユーザーに入力してもらったテキストから、正規表現「[#$&+=@|<>-]」に一致する特殊文字をすべて削除します。マッチが見つかるたびにカウントを1つ増やし、appendReplacement()で空文字列("")に置き換えることで、特殊文字を除去しています。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AppendReplacementExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String regex = "[#$&+=@|<>-]";
// Patternオブジェクトの生成
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトの生成
Matcher matcher = pattern.matcher(input);
int count = 0;
StringBuffer buffer = new StringBuffer();
System.out.println("Removing the special character form the given string");
while(matcher.find()) {
count++;
matcher.appendReplacement(buffer, "");
}
matcher.appendTail(buffer);
// 使用したパターンの取得
System.out.println("The are special characters occurred "+count+" times in the given text");
System.out.println("Text after removing all of them \n"+buffer.toString());
}
}
実行結果
Enter input text: Hello# how$ are& yo|u welco<me to> Tut-oria@ls@po-in#t. Removing the special character form the given string The are special characters occurred 11 times in the given text Text after removing all of them Hello how are you welcome to Tutorialspoint.
まとめ
- appendReplacement()は、マッチした部分を置換文字列に置き換えながらStringBufferへ追加していくメソッドです。
- find()メソッドとの組み合わせにより、複数のマッチを順番に置換できます。
- ループ終了後はappendTail()を呼び出し、最後のマッチ以降の残りの文字列を忘れずに追加しましょう。
- 置換文字列には$1などのグループ参照も使えるため、柔軟な文字列加工が可能です。
-
例で学ぶJava Matcherクラスのpattern()メソッド
java.util.regex.Matcher クラスは、正規表現による各種マッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されていないため、java.util.regex.Pattern クラスの matcher() メソッドを使用してオブジェクトを生成・取得します。 pattern() メソッドは、現在の Matcher が解釈に使用している Pattern オブジェクトを取得して返します。引数は不要で、戻り値は java.util.regex.Pattern 型です。「実際にどの正規表現で照合を行ったのか」を後から確認したい場合などに便利なメソッドです。
-
JavaのPattern.matcher()メソッドの使い方を実例で解説
Javaのjava.util.regexパッケージには、文字シーケンスの中から特定のパターンを検索するためのさまざまなクラスが用意されています。 このパッケージに含まれるPatternクラスは、正規表現をコンパイルした結果を表すクラスです。このクラスが提供するmatcher()メソッドは、入力文字列を表すCharSequenceオブジェクトを引数として受け取り、現在のPatternオブジェクトが表す正規表現と入力文字列を照合するためのMatcherオブジェクトを返します。 matcher()メソッドの基本的な流れ matcher()メソッドを使った正規表現マッチングは、一般的に以下の手順で行い