Java正则表达式转义字符
匹配某些字符(如换行符)时,可以使用正则表达式“\\ n”或实际上只是“\ n”。例如,下面将字符串分割成线的阵列:Java正则表达式转义字符
String[] lines = allContent.split("\\r?\\n");
但下面的作品一样好:
String[] lines = allContent.split("\r?\n");
我的问题:
不要在上述两项工作完全相同的方式,还是有任何细微差别?如果是后者,你能给出一个例子,你会得到不同的结果吗?
还是仅在[可能/理论]性能方面存在差异?
当前情况没有差别。通常的字符串转义序列与单个反斜线的帮助下,然后一个有效的转义字符("\n"
,"\r"
等)和正则表达式转义序列形成有字面反斜线的帮助(形成即Java字符串文字中的双反斜线)和有效的正则表达式转义字符("\\n"
,"\\d"
等)。
"\n"
(一个转义序列)是文字LF(换行)和"\\n"
是匹配的LF符号一个正则表达式的转义序列。
"\r"
(一个转义序列)是文字CR(回车)和"\\r"
是匹配的CR符号一个正则表达式的转义序列。
看到Java regex docs名单正则表达式逃逸的支持列表。
但是,如果您使用的是Pattern.COMMENTS
flag(用于引入的意见和很好格式的模式,使得正则表达式引擎忽略模式的所有转义空格),你要么需要使用"\\n"
或"\\\n"
定义一个换行符(LF )在Java字符串文字中,并且"\\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"
等于""
,它是一个空的模式,它匹配换行符之前和之后的空白空间。
是的,有不同的。对于Java Book The Java Language
规范部分3.3中的Unicode Escapes
,Java Compiler具有不同的行为;
Java编程语言指定转化 写的Unicode到ASCII改变一个程序转换成 形式,可以通过基于ASCII的工具处理程序的标准方式。转换 涉及将 程序的源文本中的任何Unicode转义转换为ASCII,方法是添加一个额外的u,例如\ uxxxx变为 \ uuxxxx,同时将 源文本中的非ASCII字符转换为包含每一个你一个。
那么如何影响/
N随//n
在Java Doc:
因此,有必要对在字符串中双反斜线 表示正则表达式由Java字节码,以保护他们免受解释 编译器。
的同一文档的一个例子:
字符串“\ b”的,例如,当解释为正则表达式匹配的单个退格 字符,而“\ B” 匹配单词边界。字符串文字“(hello)”是非法的,并且会导致编译时错误;为了匹配字符串(hello) ,必须使用字符串字符串“\(hello \)”。
您正在解释使用'“\\”'在Java字符串文字中定义单个文字反斜杠的必要性。 OP的问题是''\ n“'和'”\\ n“'是否匹配相同的字符串。虽然模式不同,但它们匹配相同的文本。这就是为什么我说*目前的情况没有区别*。 –
是的,你的回答是正确的我只是想要他们之间的差异。在某些情况下有不同的结果,在其他情况下有相同的结果。 – Gatusko
没有区别。 '\\ n'匹配一个LF,'\ n'匹配一个LF。 –
如果您使用COMMENTS模式,应该有所不同。 –
@SebastianProske那是真的。我的意思是,鉴于目前的正则表达式,没有区别。如果使用'(?x)',那么应该在Java正则表达式中转义空白字符。即使他们用于角色类。 –