无法替换所有美元符号

17

有人能解释一下,为什么我在运行这个方法替换值时遇到了数组越界异常,该方法使用 $ 符号进行替换?

例如,我传入的消息是 $$vmdomodm$$

message = message.replaceAll("$", "$");

我尝试查看这个论坛帖子,但无法理解其内容。

http://www.coderanch.com/t/383666/java/java/String-replaceAll


(注:本翻译仅供参考,不保证准确性和完整性)

你正在用 $ 替换 $,这意味着什么都不能改变。这没有意义。 - juergen d
"replaceAll" 接受一个正则表达式作为参数,表达式 "$" 匹配行尾。您期望得到什么样的结果? - Andreas Dolk
抱歉,我已经更新了,应该是:message = message.replaceAll("$", "$"); - Sillicon.Dragons
4个回答

42

这是一个特殊字符,你需要使用转义字符来处理。

试试这个 \\$

如果你的代码中尝试用相同的内容替换原内容,那么这是没有意义的。

String message = "$$hello world $$";
message = message.replaceAll("\\$", "_");
System.out.println(message);

输出

__hello world __

更新

   String message = "$hello world $$";
   message = message.replaceAll("$", "\\$");
   System.out.println(message);

输出

 $hello world $$

抱歉,我已经更新了,应该是:message = message.replaceAll("$", "$"); - Sillicon.Dragons
我正在尝试将HTML实体代码$转换为其ASCII代码等效形式。 - Sillicon.Dragons
这个字符有什么特别之处,需要我转义它吗? - Sillicon.Dragons
这是一个正则表达式模式字符。 - jmj
当我尝试这个时,我得到了错误:非法的组引用。 - john k

3

由于您并没有真正使用任何正则表达式,因此您应该使用String#replace方法来替换字符串,像这样:

message = message.replace("$", "$");

1
if(!str.isempty() && str.contains("$")){
   str = str.replaceAll("\\$", Matcher.quoteReplacement("\\$"))
}

1
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Mark Rotteveel
这实际上是唯一有效的解决方案。👍 我会雇佣这个人!:-) - Thobias Karlsson

0

在尝试使用replaceAll()时,我一直无法得到想要的结果,所以我认为编写一个函数来转义美元符号会更容易。

public static String escapeDollarSign(String value) {
    Pattern p = Pattern.compile("\\$");
    int off = 0;
    while (true) {
        Matcher m = p.matcher(value.substring(off));
        if (!m.find()) break;
        int moff = m.start();
        String left = value.substring(0, off+moff);
        String right = value.substring(off+moff+1, value.length());
        value = left+"\\$"+right;
        off += moff+1+1;
    }

    return value;
}

дЊЛе¶ВпЉЪ
$re$gex $can $ b$e a$ pain$
еПШжИР
\$re\$gex \$can \$ b\$e a\$ pain\$


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接