当使用换行符分割字符串时,为什么单个blackslash也会起作用

问题描述 投票:2回答:4

我理解这个概念,在处理正则表达式时需要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 regex
4个回答
2
投票

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

4
投票

你的单反斜杠\n在编译器级解释为字符串为LINEFEED字符,LINEFEED字符被发送到String.split()方法,java-regex引擎直接得到LINEFEED字符。

在双反斜杠\\n的情况下,你有正确的理解。源代码中的\\n在进入regex-engine时编译成\n;和\n是java-regex引擎内部LINEFEED的转义码


1
投票

这是正则表达式读取方式的副作用,原因如下:

message.split("\\n");

这将消息分为正则表达式\,然后是n,什么被编译成literal newline because of the \n escape

message.split("\n");

这将在正则表达式<newline>上拆分消息,它也被编译为文字换行符


1
投票

"\n"将以正则表达式发送单字符ascii 10。

qazxsw poi将正则表达式发送长度为2的字符串:反斜杠后跟n。

两者并不意味着相同但产生相同。

© www.soinside.com 2019 - 2024. All rights reserved.