模式中的冗余转义字符

时间:2016-12-03 23:01:40

标签: java regex

我正在尝试以下代码并且它打印错误。 我原以为这会打印出来。 另外,Pattern.Compile()statemenet提供了一个警告'冗余转义字符'。 有人可以帮助我,为什么这不会返回真实,为什么我会看到警告。

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());
}

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

由于"\\n"评估为反斜杠\\,而n字母"\\\n"评估为反斜杠\\,然后是换行符\n

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您的来源有两个字符'\''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());