当匹配某些字符(例如换行符)时,可以使用正则表达式“ \\ n”或仅使用“ \ n”。例如,以下将字符串拆分为行数组:
String[] lines = allContent.split("\\r?\\n");
但是以下内容同样适用:
String[] lines = allContent.split("\r?\n");
我的问题:
上面两个是 完全 一样地工作,还是有细微的差别?如果是后者,能否举个例子,说明您得到不同的结果?
还是仅在[可能/理论]表现上有所不同?
在当前情况下没有区别。通常的字符串转义序列是在单个反斜杠的帮助下形成的,然后有效的转义字符("\n","\r"等)和 正则表达式转义序列 在 文字 反斜杠的帮助下形成(即Java字符串中的双反斜杠)。文字)和一个有效的正则表达式转义字符("\\n","\\d",等)。
"\n"
"\r"
"\\n"
"\\d"
"\n"( 转义序列 )是文字LF(换行符),并且"\\n"是与LF符号匹配的正则表达式转义序列。
"\r"( 转义序列 )是文字CR(回车),并且"\\r"是与CR符号匹配的正则表达式转义序列。
"\\r"
"\t"( 转义序列 )是文字的制表符,"\\t"也是与制表符匹配的正则表达式转义序列。
"\t"
"\\t"
有关 正则表达式 转义的受支持列表,请参见Java regex文档中的列表。 __
但是,如果使用Pattern.COMMENTS标志(用于引入注释并很好地格式化模式,使regex引擎忽略模式中所有未转义的空格),则需要在Java字符串文字中使用"\\n"或"\\\n"定义换行符(LF)。和"\\r"或"\\\r"定义回车(CR)。
Pattern.COMMENTS
"\\\n"
"\\\r"
查看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>+ newline + <LF>?因为"(?x)\n"等于"",所以是一个空模式,它与换行符之前和之后的空格匹配。
<LF>
"(?x)\n"
""