Groovy:为什么对空字符串进行按空格分割会返回一个包含一个空字符串的列表?

4

我原本期望得到一个空列表,但实际上得到了:

assert 1 == "".split(/\s+/).size()

以及

assert 0 == "".split().size()

注:此处保留了HTML标签。

我认为这是一个bug。我会向团队中的其他人询问他们的意见。 - Jeff Scott Brown
我认为Java也可以做同样的事情。 - Jeff Scott Brown
@JeffScottBrown 我刚发现这是标准行为。请查看https://dev59.com/5WQn5IYBdhLWcg3wr4w6 - Alexander Suraphel
2
我认为人们可能会争论这是否是一个错误。虽然并非总是如此,但对于这种特殊情况,我认为与Java保持一致可能比更改更有意义。 - Jeff Scott Brown
@JeffScottBrown 没错!这种行为似乎有很好的理由。 - Alexander Suraphel
2个回答

2
也许你应该使用 tokenize() 替代?
assert "".tokenize().size() == 0
assert "foo bar".tokenize() == ['foo', 'bar']

2
我刚才发现Java和Python的String.split()也遵循这个规则。请参阅http://docs.python.org/2/library/stdtypes.html#str.split
SO问题在Python中分割空字符串时,为什么split()返回一个空列表而split('\n')返回['']?也包含了必读的答案。
得票最高的答案解释如下:

[str.split()][1]方法有两种算法。如果没有给出任何参数,则它会在重复的空格上进行分割。但是,如果给出了一个参数,则它被视为单个分隔符,没有重复运行。

在分割一个空字符串的情况下,第一种模式(无参数)将返回一个空列表,因为空格被吃掉了,没有值可以放入结果列表中。

相比之下,第二种模式(使用如\n这样的参数)将产生第一个空字段。考虑如果您编写了'\n'.split('\n'),您将得到两个字段(一个分割,给您两个部分)。

用下面的CSV数据分割的示例也是有道理的。
>>> data = '''\
Guido,BDFL,,Amsterdam
Barry,FLUFL,,USA
,,,USA
'''
>>> for line in data.splitlines():
        print(line.split(','))

['Guido', 'BDFL', '', 'Amsterdam']
['Barry', 'FLUFL', '', 'USA']
['', '', '', 'USA']

如果不将空字符串''视为实际值,则不会得到结果['', '', '', 'USA']而是['USA'],这并不是您所期望的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接