7

次のコードは、Javaのクラスのreplace()メソッドを使用しています。String

String a = "abc/xyz";
System.out.println(a.replace("/", "\\"));

/指定された文字列内で。aに置き換えられてい\ます。

次のような方法を使用すると、同じことが間違ってreplaceAll()います。

System.out.println(a.replaceAll("/", "\\"));

例外java.lang.StringIndexOutOfBoundsExceptionがスローされます。この方法では当てはまらない正規表現を使用する\ため、次のような2つの追加の円記号が必要です。replaceAll()replace()

System.out.println(a.replaceAll("/", "\\\\"));

a.replaceAll("/", "\\")唯一の問題は、このスローのように2つのスラッシュだけでこのメソッドを使用すると、なぜこのメソッドが使用されるのかということjava.lang.StringIndexOutOfBoundsExceptionです。


一方、このsplit()メソッドは最初に警告を発行しますInvalid regular expression: Unexpected internal error(NetBeans 6.9.1を使用しています)。

String b="abc\\xyz";
System.out.println(b.split("\\")[0]+b.split("\\")[1]); //Issues a warning as specified.

これを実行しようとすると、例外java.util.regex.PatternSyntaxExceptionがスローされます。

のような正規表現を使用するため、replaceAll()4つのバックスラッシュが必要です。

System.out.println(b.split("\\\\")[0]+b.split("\\\\")[1]);

a.replaceAll("/", "\\\\");前の場合のように、無効なパターンがあるにもかかわらず、なぜそのような警告またはそのような実行時例外を発行しないのですか?

4

2 に答える 2

10

JavadocString.replaceAllから

置換文字列の円記号(\)とドル記号($)により、文字列の置換文字列として扱われていた場合とは結果が異なる場合があることに注意してください。Matcher.replaceAllを参照してください。必要に応じて、Matcher.quoteReplacement(java.lang.String)を使用して、これらの文字の特別な意味を抑制します。

System.out.println(a.replaceAll("/", Matcher.quoteReplacement("\\")));
于 2012-10-17T18:56:08.600 に答える
3

このa.replaceAll( "/"、 "\")のように2つのスラッシュだけでこのメソッドを使用すると、java.lang.StringIndexOutOfBoundsExceptionがスローされるのはなぜですか?

ご存知のように、\は正規表現のメタ文字です。正規表現で使用する場合\、常に別の文字が続き\d or \sます。

パターン文字列ITSELFjava.lang.StringIndexOutOfBoundsExceptionを評価しようとしたときに例外が発生します。つまり、次の文字が見つかりません。この場合は必須です。これは、引数文字列-> abc / xyzでは発生しません。これは、以下で実行しようとしているためです。 \\a

if (nextChar == '\\') {  //<-- \\ is read here
    cursor++;

    //<--Its attempting to read next character and fails
    nextChar = replacement.charAt(cursor); 
    result.append(nextChar);
    cursor++;
}
于 2012-10-17T19:02:27.570 に答える