2017-08-25 112 views
2

匹配某些字符(如换行符)时,可以使用正则表达式“\\ n”或实际上只是“\ n”。例如,下面将字符串分割成线的阵列:Java正则表达式转义字符

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

但下面的作品一样好:

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

我的问题:

不要在上述两项工作完全相同的方式,还是有任何细微差别?如果是后者,你能给出一个例子,你会得到不同的结果吗?

还是仅在[可能/理论]性能方面存在差异?

+2

没有区别。 '\\ n'匹配一个LF,'\ n'匹配一个LF。 –

+2

如果您使用COMMENTS模式,应该有所不同。 –

+0

@SebastianProske那是真的。我的意思是,鉴于目前的正则表达式,没有区别。如果使用'(?x)',那么应该在Java正则表达式中转义空白字符。即使他们用于角色类。 –

回答

2

当前情况没有差别。通常的字符串转义序列与单个反斜线的帮助下,然后一个有效的转义字符("\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"等于"",它是一个空的模式,它匹配换行符之前和之后的空白空间。

0

是的,有不同的。对于Java Book The Java Language规范部分3.3中的Unicode Escapes,Java Compiler具有不同的行为;

Java编程语言指定转化 写的Unicode到ASCII改变一个程序转换成 形式,可以通过基于ASCII的工具处理程序的标准方式。转换 涉及将 程序的源文本中的任何Unicode转义转换为ASCII,方法是添加一个额外的u,例如\ uxxxx变为 \ uuxxxx,同时将 源文本中的非ASCII字符转换为包含每一个你一个。

那么如何影响/ N随//nJava Doc

因此,有必要对在字符串中双反斜线 表示正则表达式由Java字节码,以保护他们免受解释 编译器。

的同一文档的一个例子:

字符串“\ b”的,例如,当解释为正则表达式匹配的单个退格 字符,而“\ B” 匹配单词边界。字符串文字“(hello)”是非法的,并且会导致编译时错误;为了匹配字符串(hello) ,必须使用字符串字符串“\(hello \)”。

+1

您正在解释使用'“\\”'在Java字符串文字中定义单个文字反斜杠的必要性。 OP的问题是''\ n“'和'”\\ n“'是否匹配相同的字符串。虽然模式不同,但它们匹配相同的文本。这就是为什么我说*目前的情况没有区别*。 –

+0

是的,你的回答是正确的我只是想要他们之间的差异。在某些情况下有不同的结果,在其他情况下有相同的结果。 – Gatusko