匹配某些字符(例如换行符)时,您可以使用正则表达式" \\ n"或者确实只是" \ n"。例如,以下内容将字符串拆分为一行数组:
String[] lines = allContent.split("\\r?\\n");
但以下情况也是如此:
String[] lines = allContent.split("\r?\n");
我的问题:
上述两个是否完全以 的方式工作,或者是否有任何微妙的区别?如果是后者,你能举例说明你会得到不同的结果吗?
或仅在[可能/理论]表现方面有区别吗?
答案 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;必须使用。