Java正規表現でグループを置き換えることはできますか? 質問する

Java正規表現でグループを置き換えることはできますか? 質問する

このコードがあり、Java 正規表現でグループのみ (すべてのパターンではない) を置換できるかどうかを知りたいです。コード:

 //...
 Pattern p = Pattern.compile("(\\d).*(\\d)");
    String input = "6 example input 4";
    Matcher m = p.matcher(input);
    if (m.find()) {

        //Now I want replace group one ( (\\d) ) with number 
       //and group two (too (\\d) ) with 1, but I don't know how.

    }

ベストアンサー1

$n(nは数字)を使用して、キャプチャされたサブシーケンスを参照します。replaceFirst(...)最初のグループをリテラル文字列に置き換えたいと仮定します。"番号"2 番目のグループには最初のグループの値が適用されます。

Pattern p = Pattern.compile("(\\d)(.*)(\\d)");
String input = "6 example input 4";
Matcher m = p.matcher(input);
if (m.find()) {
    // replace first number with "number" and second number with the first
    // the added group ("(.*)" which is $2) captures unmodified text to include it in the result
    String output = m.replaceFirst("number$2$1"); // "number example input 6"
}

(\D+)2 番目のグループの代わりに を検討してください(.*)。は貪欲なマッチングであり、最初に最後の桁を消費します。 マッチングは、最後の桁に一致するものがないことに気付いたときに、最後の桁に一致する前に*バックトラックする必要があります。(\d)

編集

数年経った今でも、この質問には投票が集まり、コメントや編集(回答を壊すもの)を見ると、質問の意味についてまだ混乱があることがわかります。私はそれを修正し、非常に必要とされていたサンプル出力を追加しました。

置換の編集($2使用すべきではないと考えるもの)は、実際には回答を壊しました。投票が続くと、回答が重要なポイント(キャプチャされた値を再利用するために$n内部の参照を使用する)を押さえていることが示されますreplaceFirst(...)が、編集では、変更されていないテキストもキャプチャされ、置換で使用される必要があるという事実が失われました。グループのみ(すべてのパターンではない)「」。

この質問、そしてこの回答は繰り返しには関係ありません。これは意図的にMRE

おすすめ記事