Groovy拆分似乎忽略了空字段。
以下是代码:
line = abc,abc,,,
line.split(/,/)
println
仅打印..
abc abc
似乎忽略空字段。如何使用拆分来检索空字段?
答案 0 :(得分:11)
首先,Groovy不提供方法split(regex),它由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"}
我宁愿使用limit 0或重载的分割来丢弃不需要的空字符串。
使用-1作为限制的说明:
强调来自javadoc的以下陈述。
limit参数控制模式的次数 应用因此会影响结果数组的长度。如果 限制n大于零,那么模式将应用于 大多数n - 1次,数组的长度不会大于n,并且 数组的最后一个条目将包含除最后一个匹配之外的所有输入 分隔符。如果n是非正数,那么该模式将被应用为 尽可能多次,阵列可以有任何长度。如果n为零 那么模式将尽可能多地应用于数组 可以有任何长度,尾随空字符串将被丢弃。
答案 1 :(得分: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, , ]