替换子字符串(replaceAll)解决方法

发布于 2024-09-30 14:46:12 字数 472 浏览 3 评论 0原文

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

谢谢, 用户未知

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

}

I'm trying to replace a substring that contains the char "$". I'd be glad to hear why it didnt works that way, and how it would work.

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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

无戏配角 2024-10-07 14:46:12

Java 的.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 上,您可以 改用.replace

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

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

Java's .replaceAll implicitly uses Regex to replace. That means, $foo is interpreted as a regex pattern, and $ is special in regex (meaning "end of string").

You need to escape the $ as

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

if the target a variable, use Pattern.quote to escape all special characters on Java ≥1.5, and if the replacement is also a variable, use Matcher.quoteReplacement.

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

On Java ≥1.5, you could use .replace instead.

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

Result: http://www.ideone.com/Jm2c4

瑶笙 2024-10-07 14:46:12

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

使用String.replace(str, str)代替:

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

参考:

If you don't need Regex functionality, don't use the regex version.

Use String.replace(str, str) instead:

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

Reference:

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

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

IIRC, replaceAll take a regex : Try to escape the $, this way :

String s3 = s2.replaceAll("\\$foo", "damn");
花开雨落又逢春i 2024-10-07 14:46:12
public static String safeReplaceAll(String orig, String target, String replacement) {
    replacement = replacement.replace("$", "\\$");
    return orig.replaceAll(target, replacement);
}
public static String safeReplaceAll(String orig, String target, String replacement) {
    replacement = replacement.replace("$", "\\$");
    return orig.replaceAll(target, replacement);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文