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