TL; DRあなたは$10
が$1
と0
として扱われることを経験した場合、あなたの正規表現は、10のキャプチャグループを持っていません。
置換値で$
逆参照はappendReplacement
方法のJavadocに記載されている:
前回のマッチ中に捕捉サブへの参照含まれていてもよい置換文字列:${name}
又は$g
の各発生をそれぞれ対応するgroup(name)
またはgroup(g)
を評価した結果に置き換えられます。 $g
の場合、$
の後の最初の数字は常にグループ参照の一部として扱われます。 その後の番号は、法的なグループ参照を形成する場合はg
に組み込まれます。'0'
〜'9'
の数字のみがグループ参照の潜在的な構成要素とみなされます。たとえば、2番目のグループが文字列"foo"
と一致した場合、置換文字列"$2bar"
を渡すと、"foobar"
が文字列バッファに追加されます。ドル記号($
)は、バックスラッシュ(\$
)の前に置換文字列としてリテラルとして含めることができます。
ここ
System.out.println("ABCDEFGHIJKLMN".replaceFirst("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)",
"$11$10$9$3$2$1"));
私たちは、例えば、個々のグループとして最初の11個の文字をキャプチャ:
それでは、私たちは11個のグループを持っているとしましょうgroup(1)
は"A"
を返し、group(11)
は"K"
を返します。入力文字列は14文字であるため、最後の3文字(LMN
)は置き換えられません。結果は次のとおり
KJICBALMN
我々は、正規表現のキャプチャグループ11を削除する場合、$11
法的グループの参照ではなく、$1
リテラル1
として解釈される:
System.out.println("ABCDEFGHIJKLMN".replaceFirst("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)",
"$11$10$9$3$2$1"));
版画:だから
A1JICBAKLMN
、Iあなたは$10
が$1
のバックリファレンスとして扱われ、リテラルは0
となります。正規表現には10グループがありません。
「$ {10}」を試してください。 * Java *では、[$ 10'は期待通りに動作します](https://ideone.com/y44LKM)。 –