129

String \something\String \\something\\usingに変換しようとしてreplaceAllいますが、あらゆる種類のエラーが発生し続けます。これが解決策だと思いました:

theString.replaceAll("\\", "\\\\");

しかし、これは以下の例外を与えます:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
4

5 に答える 5

222

は、引数を正規表現String#replaceAll()として解釈します。はとの両方のエスケープ文字です。正規表現のためにそれをダブルエスケープする必要があります:\ Stringregex

string.replaceAll("\\\\", "\\\\\\\\");

ただし、文字ごとの正確な置換が必要であり、ここでパターンが必要ないという理由だけで、これに正規表現が必ずしも必要なわけではありません。したがって、String#replace()十分なはずです:

string.replace("\\", "\\\\");

更新:コメントによると、JavaScriptコンテキストで文字列を使用したいようです。StringEscapeUtils#escapeEcmaScript()代わりに、より多くの文字をカバーするために使用したほうがよいでしょう。

于 2009-11-09T15:45:49.197 に答える
14

この種の問題を回避するには、 (正規表現を使用するreplace)の代わりに(単純な文字列を使用する)を使用できます。replaceAllバックスラッシュをエスケープする必要がありますが、正規表現で必要とされるワイルドな方法ではエスケープする必要はありません。

于 2009-11-09T15:45:25.547 に答える
7

最初の引数は正規表現であるため、(エスケープされた)バックスラッシュをエスケープする必要があります。置換(2番目の引数-Matcher#replaceAll(String)を参照)にもバックスラッシュの特別な意味があるため、これらを次のように置き換える必要があります。

theString.replaceAll("\\\\", "\\\\\\\\");
于 2009-11-09T15:43:48.220 に答える
3

はい...正規表現コンパイラが指定したパターンを認識するまでに、バックスラッシュは1つしか見えません(Javaのレクサーがダブルバックワックを1つに変えたため)。信じられないかもしれません"\\\\"が、に置き換える必要があります。"\\\\"Javaには、優れた生の文字列構文が本当に必要です。

于 2009-11-09T15:44:35.993 に答える