java - 为什么replaceAll不工作?

Nin*_*Boy 8 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);
   }
}
Run Code Online (Sandbox Code Playgroud)

输出与原始输出相同.没有改变.

我希望输出为:Hel\%l\&+++o\_Wor\_++l\%d\&\#.

请帮忙.提前致谢.

Tim*_*ker 11

它无法工作的原因:您需要在Java字符串中使用四个反斜杠来创建单个"实际"反斜杠.

string = string.replaceAll(sc, "\\\\" + sc);
Run Code Online (Sandbox Code Playgroud)

应该管用.但这不是正确的方法.你根本不需要for循环:

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

你完成了

说明:

  • [%&_] 匹配您要替换的三个字符中的任何一个
  • $0 是比赛的结果,所以
  • "\\\\$0" 意思是"反斜杠加上正则表达式匹配的任何东西".

警告:这个解决方案显然不会检查这些字符中是否有任何字符先前被转义过.所以

Hello\%
Run Code Online (Sandbox Code Playgroud)

会成为

Hello\\%
Run Code Online (Sandbox Code Playgroud)

你不想发生这种事.这可能是个问题吗?

  • 非常感谢您花时间回答并解释您的答案.我现在开始了解正则表达式. (2认同)
  • @NinjaBoy:不客气:请查看http://www.regular-expressions.info - 一本很棒的正则表达式教程. (2认同)