Java中String.split("\\s")返回数组含空串的原因及实例疑问解答
关于Java String.split("\s")的两个问题解答
问题1:为什么String.split("\\s")返回的数组里会有空字符串?
其实核心原因和两个点有关:正则匹配规则,以及Java split方法的默认行为。
- 首先,
\\s是正则表达式里的元字符,用来匹配任意空白字符——包括普通空格、制表符\t、换行符\n这些,单个空白就会触发一次匹配。 - Java的
split(regex)方法默认用的是limit=0的模式:这个模式会自动丢弃数组末尾的空字符串,但开头或者中间的空字符串会保留。
举两个常见的场景:
- 如果字符串开头就有空白,比如
" hello world",开头的两个空格会被\\s分别匹配两次,每次匹配前都没有有效内容,所以数组开头就会多出两个空字符串:["", "", "hello", "world"]。 - 如果字符串中间有连续空白,比如
"hello world"(两个空格),第一个空格把hello和后面的内容分开,第二个空格匹配时,它前面的内容是空的,所以数组中间就会插入一个空字符串:["hello", "", "world"]。
问题2:给定句子拆分后出现的空字符串来自哪里?
先把你给出的句子贴出来:
"The brown fox jumped the fence jumped. The jumped fox? The fox. Jumped"
按\\s拆分后出现空字符串,大概率是因为句子里存在这两种情况之一:
- 连续的空白字符:比如句子里某两个单词之间不是一个空格,而是两个(或更多)空格。比如如果原句子里
jumped.和The之间是两个空格,那拆分时这两个空格会被分别匹配,中间就会生成一个空字符串。 - 开头的空白字符:如果句子最开头有一个(或多个)空格,那第一个匹配的空白前没有内容,数组的第一个元素就会是空字符串。
另外还有一种可能:句子里混入了看不见的空白字符(比如制表符或者换行符),这些字符也会被\\s匹配,如果和普通空格连续出现,同样会生成空字符串。
顺便提一句:如果你只想得到单词(或带标点的单词),完全可以用split("\\s+")代替split("\\s")。\\s+会匹配一个或多个连续空白字符,不管有多少空白都当作一个分隔符,这样就不会生成中间的空字符串了。如果连开头的空字符串也想去掉,可以先对句子做trim()处理,再用split("\\s+"),结果就完全符合你的预期啦。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

