【问题标题】:Java replaceAll: Cannot replace string with backslashJava replaceAll:无法用反斜杠替换字符串
【发布时间】:2019-01-01 15:42:09
【问题描述】:

在我的 Java 程序中,我试图替换字符串中包含反斜杠的子字符串(paloalto\sanjose\)。但是,即使我使用双反斜杠来减轻反斜杠作为转义字符的影响,我仍然会收到以下错误:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 9
paloalto\
         ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.replaceAll(Unknown Source)
    at Main.main(Main.java:8)

以下是我的代码:

String original = "paloalto\\adam paloalto\\jack paloalto\\justin";
System.out.println("original = " + original);

String sanjose = original.replaceAll("paloalto\\", "sanjose\\");
System.out.println("backgammon  = " + sanjose);

【问题讨论】:

  • 您需要四个反斜杠:两个用于正则表达式,两个用于编译器。但是你为什么要这样做?
  • @EJP 八个反斜杠。四个在正则表达式中,四个在替换中。 Java 文档说替换中的反斜杠可用于转义字符。

标签: java regex string replace substring


【解决方案1】:

replace 适合你,replaceAll 使用正则表达式,\\ 是特殊字符的前缀,例如 \\s 是空格,\\. 是任何字符等。

String test = "paloalto\\paloalto\\";
test = test.replace("paloalto\\", "sanhose\\");
System.out.println(test);

对于replaceAll,您可以使用Pattern.quote 的结果作为第一个参数,将Matcher.quoteReplacement 的结果作为第二个参数:

test = test.replaceAll(Pattern.quote("paloalto\\"), Matcher.quoteReplacement("sanjose\\"));

Documentation.

【讨论】:

    【解决方案2】:

    您需要四个反斜杠:两个反斜杠用于在 Java 中声明字符串(这将是实际字符串中的一个反斜杠),并且您需要在正则表达式中使用两个反斜杠,因为反斜杠再次是正则表达式引擎的特殊字符:

    original.replaceAll("paloalto\\\\", "sanjose\\\\");
    

    如果您觉得这更容易阅读,您可以使用Pattern.quote()

    original.replaceAll(Pattern.quote("paloalto\\"), Matcher.quoteReplacement("sanjose\\"));
    

    【讨论】:

      【解决方案3】:

      您需要为 replaceAll 函数提供正则表达式,并且 \(backspace) 是 java 中的转义字符。这就是为什么你需要重复 4 次才能捕获字符串。

          String original = "paloalto\\adam paloalto\\jack paloalto\\justin";
          System.out.println("original = " + original);
      
          String sanjose = original.replaceAll("paloalto\\\\", "sanjose\\\\");
          System.out.println("backgammon  = " + sanjose);
      

      这个剪断会做你想做的事。它的输出是

      original = paloalto\adam paloalto\jack paloalto\justin
      backgammon  = sanjose\adam sanjose\jack sanjose\justin
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 2018-02-27
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多