为什么这不起作用?
"hello[world".split("\[")
这样做:
"hello[world".split("\\[")
答案 0 :(得分:8)
这实际上是在不同上下文中的两个转义,因为参数是一个表示为字符串的正则表达式。
必须对[
进行转义,否则它会在正则表达式中具有特殊含义。正则表达式的转义将使它成为\[
。但是\
必须被转义,因为它在字符串中具有特殊含义(用于转义和通过数值表示字符)。
可能会更糟糕,因为\
字符用于在两种情况下进行转义。如果要按\
字符拆分,则必须将其转义(\\
)以获取正则表达式用法,但之后您有两个\
个字符,这两个字符都必须转义在字符串上下文中如果您将其作为常量编写,则您要拆分的原始字符串中的用法也需要转义,因此类似的拆分看起来像:
"hello\\world".split("\\\\")
答案 1 :(得分:1)
不同版本的Groovy会产生不同的结果。
对于Groovy 1.1-BETA-1及以后,
assert "hello[world".split("\\[") == ["hello", "world"]
断言好,但Groovy 1.0及之前发出断言错误。
assert "hello[world".split(/\[/) == ["hello", "world"]
对于从1.1-BETA-1开始的所有版本,断言好,Groovy 1.0-jsr-01到1.0会产生断言错误,而Groovy 1.0-beta-10和之前会出现词汇错误。
"hello[world".split("\\[").each{println it}
对于1.0-beta-5和beta-3的所有版本的Groovy,打印
hello
world
但1.0-beta-4打印
[.]
[.]
hello
world