java - 为什么replaceAll不工作?

时间:2012-07-12 07:30:50

标签: java regex

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

我的函数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 个答案:

答案 0 :(得分:11)

它无法工作的原因:Java字符串中需要四个反斜杠才能创建单个“实际”反斜杠。

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

应该有效。但这不是正确的方法。您根本不需要for循环:

String string = "Hel%l&+++o_Wor_++l%d&#";
string = string.replaceAll("[%&_]", "\\\\$0");

你已经完成了。

<强>解释

  • [%&_]匹配您要替换的三个字符中的任何一个
  • $0是匹配的结果,所以
  • "\\\\$0"表示“反斜杠加上正则表达式匹配的任何内容”。

警告:此解决方案显然不会检查这些字符中是否有已经先前已被转义。所以

Hello\%

会变成

Hello\\%

你不希望发生这种情况。这可能是个问题吗?