4

Groovy split 似乎忽略了空字段。

这是代码:

line = abc,abc,,,
line.split(/,/)
println

只打印..

abc abc

它似乎忽略了空字段。如何使用拆分检索空字段?

4

2 回答 2

11

首先,方法split(regex)不是 Groovy 提供的,它是 Java 提供的。

其次,您可以通过使用以下通用split(regex, int limit)来实现您所需要的:

def line = "abc,abc,,,"

println line.split(/,/, -1) //prints [abc, abc, , , ]
println line.split(/,/, -1).size() //prints 5

注意: -
您最终在打印中的字符串数组在断言时会引发编译错误。但是您可以将结果用作普通列表。

line.split(/,/, -1).each{println "Hello $it"}

我宁愿使用限制 0 或重载拆分来丢弃不需要的空字符串。

使用 -1 作为限制的说明:
强调 javadoc 中的以下语句。

limit 参数控制应用模式的次数,因此会影响结果数组的长度。如果限制 n 大于零,则模式将最多应用 n - 1 次,数组的长度将不大于 n,并且数组的最后一个条目将包含最后一个匹配分隔符之外的所有输入。如果 n 为非正数,则该模式将尽可能多地应用,并且数组可以具有任意长度。如果 n 为零,则该模式将被应用尽可能多的次数,数组可以有任意长度,并且尾随的空字符串将被丢弃。

于 2013-07-12T03:26:05.760 回答
2

有趣的。split只要最后有一个非空元素,该方法就可以按预期工作。

def list = 'abc,abc,,,abc'.split(/,/)
println list // prints [abc, abc, , ]
assert list.size() == 5
assert list[0] == 'abc'
assert list[1] == 'abc'
assert list[2] == ''
assert list[3] == ''
assert list[4] == 'abc'

也许您可以在字符串末尾附加一个虚假字符并将结果子列表:

def list = 'abc,abc,,,X'.split(/,/) - 'X'
println list // prints [abc, abc, , ]
于 2013-07-12T01:12:04.733 回答