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

时间:2018-03-22 18:04:50

标签: java regex

我理解这个概念,在处理正则表达式时需要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中不起作用。但是,它有效。我可以知道为什么会这样吗?

4 个答案:

答案 0 :(得分:4)

您的单个​​反斜杠def values = [ "1", "2", "3" ] def engine = new groovy.text.SimpleTemplateEngine() def text = '''<% values.each { println it} %>''' println engine.createTemplate(text).make([values: values]) 在编译器级别被解释为字符串为\n个字符,LINEFEED字符被发送到LINEFEED方法和java-regex引擎得到String.split()字符直接

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

答案 1 :(得分:2)

Java允许您以两种方式指定换行符。

一种方法是指定字符文字Running g.V().drop() RUs: 34.88 //clean slate Running g.V('1').addE('knows').to(g.V('1')) RUs: 1.97 //don't actually create any edge, no vertices present Running g.addV('person').property('id', '1').property('tenantId', '1') RUs: 5.71 Running g.V('1').addE('knows').to(g.V('1')) RUs: 11.4 //1st edge, 1 vertex present Running g.addV('person').property('id', '2').property('tenantId', '1') RUs: 5.71 //constant vertex creation cost Running g.V('1').addE('knows').to(g.V('1')) RUs: 11.76 //2nd edge, 2 vertices + 1 edge present - cost goes up Running g.addV('person').property('id', '3').property('tenantId', '2') RUs: 5.71 //constant vertex creation cost - this vertex is on a different partition Running g.V('1').addE('knows').to(g.V('1')) RUs: 12.1 //3rd edge, 3 vertices + 2 edges present - cost goes up Running g.V('1').addE('knows').to(g.V('1')) RUs: 12.28 // 4th edge, 3 vertices + 3 edges present - cost goes up Running g.V('1').addE('knows').to(g.V('1')) RUs: 12.46 // 5th edge, 3 vertices + 4 edges present - cost goes up ,就像用逗号分隔\n或任何其他 所需的字符一样转义。

但是Java does allow you to specify a special construct for a newline character

(在&#34;正则表达式构造摘要&#34;部分)

  

,换行符(换行符)(\n

这是一个正则表达式构造。这不是单个字符'\u000A',这是一个反斜杠后跟一个&#34; n&#34;如你所知,字符和反斜杠需要转义为Java \n

没有任何事情迫使您使用构造\\而不是文字\\n

所有这些意味着您可以选择指定字符文字\n或使用正则表达式构造 - 2个字符 - \n

该构造具有可打印的优点,以防您想要打印您要拆分的模式。

\\n

答案 2 :(得分:1)

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

message.split("\\n");

这会将邮件拆分为正则表达式\,后跟n,汇编为literal newline because of the \n escape

message.split("\n");

这会将正则表达式<newline>上的消息拆分为什么也会被编译为文字换行符

答案 3 :(得分:1)

echo '—' | od -c 将以正则表达式发送ascii 10的单个字符。

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

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