Java - 为什么replaceAll方法不起作用?

8

我开始学习正则表达式,但不确定是否理解正确。

我在使用replaceAll函数时遇到了问题,它没有替换我想要替换的字符串中的字符。

这是我的代码:

public class TestingRegex {
   public static void main (String args[]) {
      String string = "Hel%l&+++o_Wor_++l%d&#";

      char specialCharacters[] = {'%', '%', '&', '_'};

      for (char sc : specialCharacters) {
          if (string.contains(sc + ""))
              string = string.replaceAll(sc + "", "\\" + sc);
      }

      System.out.println("New String: " + string);
   }
}

输出与原始内容相同,没有改变。
我希望输出为:Hel\%l\&+++o\_Wor\_++l\%d\&\#
请帮忙,谢谢。

1
可能是反斜杠问题的重复。 - Pavan Manjunath
@PavanManjunath:除了NinjaBoy没有真正知道反斜杠是这种情况的罪魁祸首。 - Tim Pietzcker
1个回答

11

它不起作用的原因是:在Java字符串中,您需要使用四个反斜杠才能创建一个单独的“真实”反斜杠。

string = string.replaceAll(sc, "\\\\" + sc);

这应该可以工作。但这不是正确的做法。你根本不需要使用for循环:

String string = "Hel%l&+++o_Wor_++l%d&#";
string = string.replaceAll("[%&_]", "\\\\$0");
并且你已经完成了。 解释:
  • [%&_] 匹配需要替换的三个字符之一
  • $0 是匹配到的结果,所以
  • "\\\\$0" 表示 "一个反斜杠再加上正则表达式所匹配到的任何内容"。

注意:该解决方案显然未检查这些字符是否已被转义。因此,

Hello\%

会变成什么?

Hello\\%

你肯定不想这种情况发生。这可能会成为一个问题吗?


2
非常感谢您抽出时间回答并解释您的答案。我现在开始理解正则表达式了。 - NinjaBoy
2
@NinjaBoy:不用谢:看看http://www.regular-expressions.info——一个很棒的正则表达式教程。 - Tim Pietzcker
我使用循环的原因是因为我假设特殊字符来自枚举字段。 - NinjaBoy
@NinjaBoy:在构建字符类时,你需要小心一些。一些字符(特别是 ^]-)在字符类内具有特殊含义,需要进行转义或放置在特定的位置。请查看我上面发布的链接下的字符类部分以获取更多信息。 - Tim Pietzcker

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