9

为什么这不起作用?

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

这确实:

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

2 回答 2

9

这实际上是不同上下文中的两次转义,因为参数是表示为字符串的正则表达式。

必须转义,[否则它将在正则表达式中具有特殊含义。正则表达式的转义将使它成为\[. 但是\必须转义,因为它在字符串中具有特殊含义(用于转义和用数值表示字符)。

情况可能会更糟,因为\角色在两种情况下都用于转义。如果要按\字符拆分,则必须将其转义 ( \\) 以使用正则表达式,但是您有两个\字符,它们都必须在字符串上下文中进行转义。如果将要拆分的原始字符串中的用法写为常量,则也需要转义,因此类似的拆分如下所示:

"hello\\world".split("\\\\")
于 2012-07-08T14:12:20.600 回答
1

不同版本的 Groovy 给出不同的结果。

对于 Groovy 1.1-BETA-1 及更高版本,

assert "hello[world".split("\\[") == ["hello", "world"]

断言 OK,但 Groovy 1.0 及之前的版本给出了断言错误。

assert "hello[world".split(/\[/) == ["hello", "world"]

从 1.1-BETA-1 开始的所有版本都断言 OK,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
于 2012-07-12T10:04:55.773 回答