Java正则表达式转义字符

时间:2017-08-25 13:14:26

标签: java regex

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

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

但以下情况也是如此:

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

我的问题:

上述两个是否完全以 的方式工作,或者是否有任何微妙的区别?如果是后者,你能举例说明你会得到不同的结果吗?

或仅在[可能/理论]表现方面有区别吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

请参阅Java regex docs中的列表,了解受支持的 regex 转义列表。

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

查看Java test

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", "<LF>")); 
// => <LF>
//<LF>

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

答案 1 :(得分:0)

是的,有不同之处。 Java编译器在Unicode Escapes规范部分3.3;

中对Java Book The Java Language具有不同的行为
  

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

这是如何影响Java Doc/ n与//n的对比:

  

因此有必要在字符串文字中加倍反斜杠   表示正则表达式以保护它们免于解释   由Java字节码编译器。

相同文档的一个示例:

  

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