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\&\#

请帮忙。提前致谢。

4

1 回答 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\\%

这是你不希望发生的。这会是个问题吗?

于 2012-07-12T07:34:20.620 回答