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

5 投票
2 回答
4515 浏览
提问于 2025-05-01 07:59

我本来以为会得到一个空列表,但结果是:

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

还有

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

暂无标签

2 个回答

2

也许你应该用 tokenize() 呢?

assert "".tokenize().size() == 0
assert "foo bar".tokenize() == ['foo', 'bar']
3

我刚发现Java和Python的 String.split() 方法也遵循这个规律。你可以查看这个链接:http://docs.python.org/2/library/stdtypes.html#str.split

在StackOverflow上有个问题 当在Python中分割一个空字符串时,为什么split()返回一个空列表,而split('\n')返回['']?,里面有很多值得阅读的回答。

最受欢迎的回答解释了:

str.split() 方法有两种算法。如果不传任何参数,它会在连续的空白字符上进行分割。但是如果传了参数,它就会把这个参数当作一个单独的分隔符,不会考虑连续的空白。

在分割一个空字符串的情况下,第一种模式(不传参数)会返回一个空列表,因为空白字符被“吃掉”了,结果列表里没有值可以放。

而第二种模式(传入参数,比如 \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'],这并不是你所期待的结果。

撰写回答