このコードがあり、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。