【问题标题】:Redundant escape character in Pattern模式中的冗余转义字符
【发布时间】:2016-12-03 23:01:39
【问题描述】:

我正在尝试以下代码,但它打印错误。 我预计这会打印成真的。 此外,Pattern.Compile() statemenet 给出警告“冗余转义字符”。 有人可以帮助我了解为什么这没有返回 true 以及为什么我会看到警告。

public static void main(String[] args) {
    String s = "\\n";
    System.out.println(s);

    Pattern p = Pattern.compile("\\\n");
    Matcher mm = p.matcher(s);
    System.out.println(mm.matches());
}

【问题讨论】:

  • \\n != \\\n - 您将字母 'n' 与换行符 '\n' 进行比较

标签: java regex


【解决方案1】:

s="\\n" 表示您将反斜杠和n 分配给变量s,它包含一个两个字符的序列\n

Pattern.compile("\\\n") 表示您定义了一个匹配换行符的正则表达式模式\n。因此,此模式不会匹配变量 s 中的字符串。

多余的转义警告与您在 C 字符串文字中使用三重反斜杠的事实有关:两个反斜杠定义文字反斜杠,第三个是多余的,即有文字 \ 然后换行符转义序列"\n",这意味着文字反斜杠(用文字中的2个反斜杠定义)是多余的,可以删除。

【讨论】:

  • \\n in 表示 \ 和 n 个字符。模式中的 \\\n 也应该意味着: \\n ,这意味着它应该匹配 \ 和 n。
  • 要匹配包含反斜杠和n 的字符串,您需要String pattern = "\\\\n"。要匹配反斜杠,您需要在字符串中使用 4 个反斜杠来表示传递给正则表达式引擎的字符串中的 2 个反斜杠。
  • 所以,如果这回答了您的问题,请告诉我。如果没有,请分享您的代码或解释现实生活场景
【解决方案2】:

因为"\\n" 计算为反斜杠\\ 和字母n,而"\\\n" 计算为反斜杠\\,然后是换行符\n

【讨论】:

    【解决方案3】:

    Java 源代码中字符串文字中的反斜杠按照 Java™ 语言规范的要求解释为 Unicode 转义(第 3.3 节)或其他字符转义(第 3.10.6 节),因此有必要在字符串文字中使用双反斜杠表示正则表达式以保护它们免受 Java 字节码编译器的解释。例如,字符串文字“\b”在解释为正则表达式时匹配单个退格字符,而“\\b”匹配单词边界。

    参考:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

    【讨论】:

      【解决方案4】:

      您的源 s 有两个字符,'\''n',如果您的意思是 \ 后跟换行符,那么它应该是 "\\\n"

      模式有两个字符 '\' 和 '\n'(换行符)和 \ 不需要转义字符,因此发出警告。如果您的意思是 \ 后跟换行符,则应该是 "\\\\\n" (两次 \ 以将其转义为正则表达式,然后是 \n)。

          String s = "\\\n";
          System.out.println(s);
      
          Pattern p = Pattern.compile("\\\\\n");
      
          Matcher mm = p.matcher(s);
          System.out.println(mm.matches());
      

      【讨论】:

        猜你喜欢
        • 2019-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多