1

ArrayOutOfBoundsException使用すると奇妙になりreplaceFirstます:

"this is an example string".replaceFirst("(^this )", "$1\\") // throws ArrayOutOfBoundsException
"this is an example string".replaceFirst("(^this )", "$1") // works fine

私はこの文字列を達成しようとしています:

"this \is an example string"

置換文字列にエスケープされたバックスラッシュを挿入しようとすると、ArrayOutOfBoundsException が発生するのはなぜですか? 違いがある場合、これはAndroidで発生しています

これは、例外のイデオンの例です。

logcat 例外スタック トレースは次のとおりです。

java.lang.ArrayIndexOutOfBoundsException: java.util.regex.Matcher.appendEvaluated(Matcher.java:149) で index=14、java.util.regex.Matcher.appendReplacement(Matcher.java:111) で java.util.regex. java.lang.String.replaceFirst(String.java:1793) の Matcher.replaceFirst(Matcher.java:304)

4

4 に答える 4

3

この正規表現を使用する必要があります:-

"this is an example string".replaceFirst("(^this )", "$1\\\\");

\ダブルエスケープする必要があるためです。したがって、毎回\4 が必要になります\(最初は 2\だったので、後で変更する必要がある場合に備えて、この情報を提供してください)。

この回答から数行引用します:-

2 番目の引数は正規表現文字列ではなく、正規表現置換文字列であり、バックスラッシュにも特別な意味があります (変数補間に使用される特殊文字 $ をエスケープするために使用され、それ自体をエスケープするためにも使用されます)。

于 2013-10-01T10:55:07.577 に答える
2
"this is an example string".replaceFirst("(^this )", "$1\\")

上記のコードでは、\\は実際には\1 つのみです (最初のバックスラッシュは 2 番目のバックスラッシュをエスケープするために使用されます。文字列のバックスラッシュは他のものをエスケープするためのものであり、それ自体では何の意味もありません)。

しかし!正規表現では、単一のバックスラッシュがエスケープ目的で使用されるため、もう一度エスケープする必要があります。したがって、Java の正規表現 String でリテラル バックスラッシュが必要な場合は、4 つのバックスラッシュを記述する必要があります"\\\\"

于 2013-10-01T10:59:58.723 に答える
1

試す:

"this is an example string".replaceFirst("(^this )", "$1\\\\");

出力:

this \is an example string

StringのreplaceFirstlikereplaceAll関数は正規表現を実行し、最初\にリテラルであるため (yielding \\) をエスケープし、次に正規表現 (yielding ) のために再びエスケープする必要があり\\\\ます。

于 2013-10-01T10:55:23.937 に答える
1

必要になるだろう:

"this is an example string".replaceFirst("(^this )", "$1\\\\");

正規表現で必要な二重エスケープのためです。

PS:$1置換された文字列は実際には正規表現ではありませんが、などのグループ化された変数を使用するため、$2正規表現エンジンによって処理されるため、二重のエスケープが必要です。

**対照的に、正規表現を避けたい場合は、単に次を使用しますSring#replace(String n, String r)

"this is an example string".replace("this ", "this \\")

明らかにここには正規表現が含まれていないため、単一のエスケープだけで十分です。

于 2013-10-01T10:55:53.893 に答える