当匹配某些字符(比如换行符)时,可以使用正则表达式"\n“,或者只使用"\n”。例如,下面的代码将字符串拆分为行数组:
String[] lines = allContent.split("\\r?\\n");
但是下面的方法同样有效:
String[] lines = allContent.split("\r?\n");
我的问题是:
上面两个是以完全相同的方式工作的,还是有什么细微的区别?如果是后者,你能举一个不同结果的例子吗?
或者只在可能的/理论上的性能上存在差异?
发布于 2017-08-25 21:36:46
在当前情况下没有什么不同。通常的字符串转义序列是由一个反斜杠和一个有效的转义字符("\n"
、"\r"
等)组成的。正则表达式转义序列是在文字反斜杠(即Java string文字中的双反斜杠)和有效正则表达式转义字符("\\n"
、"\\d"
等)的帮助下形成的。
"\n"
(转义序列)是文字LF (换行符),"\\n"
是匹配LF符号的正则表达式转义序列。
"\r"
(转义序列)是文字CR (回车),"\\r"
是匹配CR符号的正则表达式转义序列。
"\t"
(转义序列)是文字制表符,而"\\t"
是与制表符匹配的正则表达式转义序列。
有关支持的正则表达式转义列表,请参阅Java regex docs中的列表。
但是,如果使用Pattern.COMMENTS
flag (用于引入注释和很好地格式化模式,使正则引擎忽略模式中所有未转义的空格),则需要使用"\\n"
或"\\\n"
在Java string文本中定义换行符(LF),使用"\\r"
或"\\\r"
定义回车符(CR)。
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"
等于""
,这是一个空模式,它匹配换行符前后的空格。
https://stackoverflow.com/questions/45882306
复制相似问题