Groovy:为什么空字符串按空格分割会返回一个包含一个空字符串的列表?
我本来以为会得到一个空列表,但结果是:
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']
,这并不是你所期待的结果。