Java正则表达式转义字符

2023-12-04

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

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

但以下方法也同样有效:

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

我的问题:

完成以上两项工作exactly是一样的,还是有什么细微的差别?如果是后者,你能举一个得到不同结果的例子吗?

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


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

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

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

"\t" (an 转义序列) 是一个文字制表符并且"\\t"是与制表符匹配的正则表达式转义序列。

请参阅列表中的Java 正则表达式文档对于支持的列表regex逃脱。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java正则表达式转义字符 的相关文章

随机推荐