我理解这个概念,在处理正则表达式时需要2个反斜杠 - https://stackoverflow.com/a/1701876/72437
以下代码能够无问题地拆分hello和world。
String message = "hello\nworld";
String[] result = message.split("\\n");
// hello
// world
for (String r : result) {
System.out.println(r);
}
但是,如果我使用1反斜杠,它也可以。 (也能分开你好和世界)
String message = "hello\nworld";
String[] result = message.split("\n");
// hello
// world
for (String r : result) {
System.out.println(r);
}
我希望使用只有1个反斜杠的正则表达式在Java中不起作用。但是,它有效。我可以知道为什么会这样吗?
Java允许您以两种方式指定换行符。
一种是通过指定字符文字\n
,就像用逗号,
或任何其他不需要正则表达式转义的字符一样。
但是Java does allow you to specify a special construct for a newline character。
(在“正则表达式构造的摘要”部分中)
\n
换行符(换行符)('\u000A'
)
这是一个正则表达式构造。这不是单个字符\n
,这是一个反斜杠后跟一个“n”字符,反斜杠需要转义为Java,如你所知,\\
。
没有什么可以强迫你使用构造\\n
而不是文字\n
。
所有这些意味着您可以选择指定字符文字\n
或使用正则表达式构造 - 2个字符 - \\n
。
该构造具有可打印的优点,以防您想要打印您正在拆分的模式。
System.out.println("\\n"); // \n
你的单反斜杠\n
在编译器级解释为字符串为LINEFEED
字符,LINEFEED
字符被发送到String.split()
方法,java-regex引擎直接得到LINEFEED
字符。
在双反斜杠\\n
的情况下,你有正确的理解。源代码中的\\n
在进入regex-engine时编译成\n
;和\n
是java-regex引擎内部LINEFEED
的转义码
这是正则表达式读取方式的副作用,原因如下:
message.split("\\n");
这将消息分为正则表达式\
,然后是n
,什么被编译成literal newline because of the \n
escape
message.split("\n");
这将在正则表达式<newline>
上拆分消息,它也被编译为文字换行符
"\n"
将以正则表达式发送单字符ascii 10。
qazxsw poi将正则表达式发送长度为2的字符串:反斜杠后跟n。
两者并不意味着相同但产生相同。