Groovy:为什么我需要双重转义方括号?

时间:2012-07-08 13:53:29

标签: groovy

为什么这不起作用?

"hello[world".split("\[")

这样做:

"hello[world".split("\\[")

2 个答案:

答案 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