Java正则表达式转义字符

匹配某些字符(例如换行符)时,可以使用正则表达式“\\ n”或实际上只使用“\ n”。 例如,以下内容将字符串拆分为一行数组:

String[] lines = allContent.split("\\r?\\n"); 

但以下工作也同样如此:

 String[] lines = allContent.split("\r?\n"); 

我的问题:

以上两种方式是否完全相同 ,还是有任何微妙的区别? 如果是后者,你能给出一个例子,你会得到不同的结果吗?

或者仅在[可能/理论]性能方面存在差异?

目前的情况没有区别。 通常的字符串转义序列是在单个反斜杠的帮助下形成的,然后是一个有效的转义字符( "\n""\r" "\n"等)和正则表达式转义序列是在文字反斜杠的帮助下形成的(即,Java字符串文字中的双反斜杠)和有效的正则表达式转义字符( "\\n""\\d"等)。

"\n"转义序列 )是文字LF(换行符), "\\n"是与LF符号匹配的正则表达式转义序列。

"\r"转义序列 )是文字CR(回车), "\\r"是与CR符号匹配的正则表达式转义序列。

"\t"转义序列 )是文字制表符号, "\\t"是与制表符号匹配的正则表达式转义序列。

有关受支持的regex转义列表,请参阅Java regex文档中的列表。

但是,如果使用Pattern.COMMENTS标志 (用于引入注释并很好地格式化模式,使正则表达式引擎忽略模式中所有未转义的空格),则需要使用"\\n""\\\n"在Java字符串文字中定义换行符(LF)和"\\r""\\\r"以定义回车符(CR)。

查看Java测试 :

 String s = "\n"; System.out.println(s.replaceAll("\n", "LF")); // => LF System.out.println(s.replaceAll("\\n", "LF")); // => LF System.out.println(s.replaceAll("(?x)\\n", "LF")); // => LF System.out.println(s.replaceAll("(?x)\\\n", "LF")); // => LF System.out.println(s.replaceAll("(?x)\n", "")); // =>  // 

为什么最后一个产生 +换行+ ? 因为"(?x)\n"等于"" ,一个空模式,它匹配换行符之前和之后的空白空格。

是的,有不同的。 Java编译器在Java Book The Java Language Specification section 3.3中对Unicode Escapes有不同的行为。

Java编程语言指定了一种将用Unicode编写的程序转换为ASCII的标准方法,该程序将程序更改为可由基于ASCII的工具处理的forms。 转换涉及通过添加额外的u来将程序源文本中的任何Unicode转义转换为ASCII – 例如,\ uxxxx变为\ uuxxxx – 同时将源文本中的非ASCII字符转换为包含单个u的Unicode转义。

那么这会如何影响Java Doc中的/ n vs //n

因此,有必要在表示正则表达式的字符串文字中加倍反斜杠,以防止它们被Java字节码编译器解释。

一个相同文档的示例:

例如,字符串文字“\ b”在解释为正则表达式时匹配单个退格字符,而“\ b”匹配单词边界。 字符串文字“(hello)”是非法的,会导致编译时错误; 为了匹配字符串(hello),必须使用字符串文字“\(hello \)”。