5

文字「$」を含む部分文字列を置き換えようとしています。なぜそのように機能しなかったのか、どのように機能するのかを聞いてうれしいです.

ありがとう、user_unknown

public class replaceall {
    public static void main(String args[]) {
        String s1= "$foo - bar - bla";
        System.out.println("Original string:\n"+s1);
        String s2 = s1.replaceAll("bar", "this works");
        System.out.println("new String:\n"+s2);
        String s3 = s2.replaceAll("$foo", "damn");
        System.out.println("new String:\n"+s3);
    }

}
4

4 に答える 4

14

Java.replaceAllは、暗黙的に正規表現を使用して置き換えます。つまり、$fooは正規表現パターンとして解釈され、正規$表現(「文字列の終わり」を意味する)で特別です。

$あなたはとして脱出する必要があります

String s3 = s2.replaceAll("\\$foo", "damn");

ターゲットが変数の場合は、Pattern.quoteJava≥1.5のすべての特殊文字をエスケープするために使用します。置換も変数の場合は、を使用しますMatcher.quoteReplacement

String s3 = s2.replaceAll(Pattern.quote("$foo"), Matcher.quoteReplacement("damn"));

Java≥1.5では、代わりにを使用.replaceできます。

String s3 = s2.replace("$foo", "damn");

結果:http ://www.ideone.com/Jm2c4

于 2010-11-05T12:33:08.957 に答える
9

正規表現機能が必要ない場合は、正規表現バージョンを使用しないでください。

String.replace(str, str)代わりに使用してください:

String s = "$$$";
String rep = s.replace("$", "€");
System.out.println(rep);
// Output: €€€

参照:

于 2010-11-05T12:37:43.137 に答える
5

IIRC、replaceAllは正規表現を取ります:この方法で$をエスケープしてみてください:

String s3 = s2.replaceAll("\\$foo", "damn");
于 2010-11-05T12:32:08.810 に答える
0
public static String safeReplaceAll(String orig, String target, String replacement) {
    replacement = replacement.replace("$", "\\$");
    return orig.replaceAll(target, replacement);
}
于 2012-03-01T17:04:18.370 に答える