2017-11-09 13 views
-1

私はRegex検索で複数のグループを使用し、文字列の多くの部分を置き換えます。私は、String.replaceFirstを使用する場合、Android Javaで$ 1 $ 2などを使用します。例えばreplaceFirstというの$ 10それを参照しようとしたとき、私は私の正規表現の検索に9つの以上のグループを使用する場合はAndroidの正規表現JAVA - 9個以上の後方参照を指定するには?

、それは最初の後方参照を交換し、その後リテラル0

印刷し、私が使用することができますとにかくあり10番目の参照?それを参照する別の方法はありますか?

例ですが、9個以上の逆参照を使用しようとしています。 $ 10は$ 1しか見ません。

String.replaceFirst("(hello)(.*)(this)","$1middle$2"); 
+0

「$ {10}」を試してください。 * Java *では、[$ 10'は期待通りに動作します](https://ideone.com/y44LKM)。 –

答えて

0

TL; DRあなたは$10$10として扱われることを経験した場合、あなたの正規表現は、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グループがありません。

+0

こんにちは、あなたの例を試しました。私はAndroid Studioを使用しています。 それが使用するAndroid Javaバージョンでは、これをサポートしてはいけません。私はこの出力を得る - A1A0ICBALMN – zeroprobe

0

また、name them(?<name>...)を入力し、${name}で参照することもできます。

String.replaceFirst("(?<g1>hello)(?<g2>.*)(?<g3>this)","${g1}middle${g2}"); 
関連する問題