1. ホーム
  2. java

[解決済み] Java Regex Replace with Capturing Group (Java正規表現とキャプチャグループの置き換え)

2023-08-16 02:15:36

質問

正規表現をキャプチャグループの変更内容で置き換える方法はありますか?

例を挙げます。

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher(text);
resultString = regexMatcher.replaceAll("$1"); // *3 ??

そして、すべての出現を$1×3倍で置き換えたい。

を編集してください。

どうやら、何かが間違っているようです :(

もし、私が

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher("12 54 1 65");
try {
    String resultString = regexMatcher.replaceAll(regexMatcher.group(1));
} catch (Exception e) {
    e.printStackTrace();
}

IllegalStateExceptionを投げます。一致するものがありません

しかし

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher("12 54 1 65");
try {
    String resultString = regexMatcher.replaceAll("$1");
} catch (Exception e) {
    e.printStackTrace();
}

は正常に動作しますが、$1を変更することができません :(

を編集してください。

これで、動作するようになりました :)

どのように解決するのですか?

どうでしょう。

if (regexMatcher.find()) {
    resultString = regexMatcher.replaceAll(
            String.valueOf(3 * Integer.parseInt(regexMatcher.group(1))));
}

最初のマッチを取得するために #find() . その後に #group(1) を使ってこの最初のマッチを参照し、すべてのマッチを最初の maches 値に 3 を掛けたもので置き換えます。

また、各マッチをそのマッチの値に3を掛けたもので置き換えたい場合には、そのマッチの値で置き換えます。

    Pattern p = Pattern.compile("(\\d{1,2})");
    Matcher m = p.matcher("12 54 1 65");
    StringBuffer s = new StringBuffer();
    while (m.find())
        m.appendReplacement(s, String.valueOf(3 * Integer.parseInt(m.group(1))));
    System.out.println(s.toString());

を覗いてみるとよいでしょう。 Matcher のドキュメント をご覧ください。この他にも多くのことが詳細に説明されています。