【问题标题】:Replace substring (replaceAll) workaround替换子字符串 (replaceAll) 解决方法
【发布时间】:2011-05-05 14:03:27
【问题描述】:

我正在尝试替换包含字符“$”的子字符串。我很高兴听到它为什么不能这样工作,以及它是如何工作的。

谢谢, 用户未知

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);
    }

}

【问题讨论】:

标签: java string substring replaceall


【解决方案1】:

Java's .replaceAll 隐式使用 Regex 进行替换。这意味着,$foo 被解释为正则表达式模式,而$ 在正则表达式中是特殊的(意思是“字符串结尾”)。

您需要将$ 转义为

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

如果目标是变量,使用Pattern.quote转义Java≥1.5的所有特殊字符,如果替换也是变量,使用Matcher.quoteReplacement

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

在 Java ≥1.5 上,您可以use .replace instead

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

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

【讨论】:

  • 很好的答案,但恕我直言,您解决了错误的问题。
  • 另请注意replaceAll() 的替换字符串也可能需要转义(使用Pattern.quoteReplacement())。
【解决方案2】:

如果您不需要正则表达式功能,请不要使用正则表达式版本。

改用String.replace(str, str)

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

参考:

【讨论】:

  • +1 - 我接受了这个答案。 replaceAll 用于替换模式的匹配项,replace 用于字符序列替换(这正是我们想要的)
【解决方案3】:

IIRC,replaceAll 采用正则表达式:尝试转义 $,这样:

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

【讨论】:

    【解决方案4】:
    public static String safeReplaceAll(String orig, String target, String replacement) {
        replacement = replacement.replace("$", "\\$");
        return orig.replaceAll(target, replacement);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2011-04-06
      • 2019-01-01
      相关资源
      最近更新 更多