1
String url = "d://test////hello\\\hello";
String separator = File.separator;
url = url.replaceAll("\\*", separator);
url = url.replaceAll("/+", separator);

それらをフォーマットしたいのですurlが、使用しようとするとエラーが発生しますreplaceAll("/+", separator)"/"そして、私はとして脱出しようとしましたが"\\/"、それでも機能しません。

これはコンソールからの例外です:

Exception in thread "main" **java.lang.StringIndexOutOfBoundsException**: String index out of range: 1
    at java.lang.String.charAt(String.java:686)
    at java.util.regex.Matcher.appendReplacement(Matcher.java:703)
    at java.util.regex.Matcher.replaceAll(Matcher.java:813)
    at java.lang.String.replaceAll(String.java:2189)

今それは動作します

 String separator = null;
 if(File.separator.equals("/")) {
    separator = "/";
    url = url.replaceAll("/+", separator);
    url = url.replaceAll("\\\\+", separator);
 } else {
    separator = Matcher.quoteReplacement(File.separator);
    url = url.replaceAll("/+", separator);
    url = url.replaceAll("\\+", separator);
 }

:)それはjavascriptで動作します

var i = "d:\\ad////df";
alert(i.replace(/\/+/g, '\\'));
4

2 に答える 2

3

試す:

url = url.replaceAll("\\\\+", separator);

4つの円記号が必要です。Java文字列の場合は1回、正規表現メタ文字の場合は1回エスケープします。これは、正規表現の場合、2つの円記号が必要\\であり、文字列では、両方を別の2つでエスケープする必要があります。

また、数量詞*はゼロ以上を意味するため、を使用する必要があります+

于 2013-03-11T03:03:32.287 に答える
3

あなたのプラットフォームはWindowsですよね?File.separatorでは、バックスラッシュは正しいでしょうか?

説明は、の2番目の引数がString.replaceAll単純な文字列ではないということです。むしろそれは交換パターンです...

javadocによると:

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

したがって、単一の円記号で構成される置換文字列は、無効なリテラル置換文字列です。javadocが言うように、区切り文字列を引用する必要があります。

(その特定の例外が発生するのは少し驚きです。それがどのように発生するかは想像できますが、悪いエスケープをよりエレガントに処理すると思いました。これが「バグ」として報告された場合は、注意してください。 、Oracleはおそらくそれを修正しません。修正すると下位互換性が失われます。)

于 2013-03-11T03:11:36.727 に答える