Javaで実装するサンプルを2つ紹介します。
$nを使用する方法
Matcher#replaceAllメソッドや、Matcher#replaceFirstメソッドは$nで後方参照を使用できます。
String regex = "\\[([0-9]+)\\]"; String src = "[1] [2] [3] [4] [5]"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); String result1 = matcher.replaceAll("($1)"); System.out.println(result1); // => (1) (2) (3) (4) (5)
Matcher#groupを使用する方法
Matcher#groupメソッドを使用する方法は多少複雑です。
正規表現にマッチする部分は、Matcher#startメソッドとMatcher#endから取得できます。
この部分文字列を置き換えてしまえばいいというわけです。
こちらの方法では、後方参照で取得した文字列を元にして、編集を加えられるというメリットがあります。
サンプルではアラビア数字から漢数字へ置き換えています。
String regex = "\\[([0-9]+)\\]"; String src = "[1] [2] [3] [4] [5]"; String[] kan = {"一", "ニ", "三", "四", "五"}; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); StringBuilder result2 = new StringBuilder(); int lastEnd = 0; String outOfMatch = ""; while(matcher.find()) { outOfMatch = src.substring(lastEnd, matcher.start()); String group = matcher.group(1); int n = Integer.parseInt(group); String kanN = kan[n-1]; result2.append(outOfMatch); result2.append("(" + kanN + ")"); lastEnd = matcher.end(); } outOfMatch = src.substring(lastEnd); result2.append(outOfMatch); System.out.println(result2); // => (一) (ニ) (三) (四) (五)
以下、サンプルソース全体です。
import java.util.regex.Pattern; import java.util.regex.Matcher; public class Program { public static void main(String[] args) { // 正規表現の後方参照の使い方を紹介するプログラム // []に囲まれた数字を()に囲まれた数字に置換し、画面へ出力する // 1. $nを使う方式 // - Pattern#matcherを呼び、Matcherオブジェクトを得る // - Matcher#replaceAllの引数として$1を与えて置換する // 2. groupを使う方式 // - Pattern#matcherを呼び、Matcherオブジェクトを得る // - Matcher#findを条件としてループする // - 前回のMatcher#endからMatcher#startを結果文字列へ追加する // - Matcher#group(1)を漢数字へ変換し、()で囲み、結果文字列へ追加する // - 末尾の文字列を追加する String regex = "\\[([0-9]+)\\]"; String src = "[1] [2] [3] [4] [5]"; String[] kan = {"一", "ニ", "三", "四", "五"}; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); String result1 = matcher.replaceAll("($1)"); System.out.println(result1); matcher.reset(); StringBuilder result2 = new StringBuilder(); int lastEnd = 0; String outOfMatch = ""; while(matcher.find()) { outOfMatch = src.substring(lastEnd, matcher.start()); String group = matcher.group(1); int n = Integer.parseInt(group); String kanN = kan[n-1]; result2.append(outOfMatch); result2.append("(" + kanN + ")"); lastEnd = matcher.end(); } outOfMatch = src.substring(lastEnd); result2.append(outOfMatch); System.out.println(result2); } }
参考
Matcher#replaceAll、String#replaceAllで後方参照が使える
Matcher (Java Platform SE 7 ) - Oracle Documentation
Pattern (Java Platform SE 7 ) - Oracle Documentation
0 件のコメント:
コメントを投稿