如何避免Java字符串Split分割时出现空值?
解决Java Split开头分隔符导致的空元素问题
这个问题很典型——当你的字符串以分隔符开头时,split() 默认会生成一个空的首元素,而你用 -1 参数其实是用来保留末尾的空元素,对开头的情况完全不起作用,这就是为什么你改了参数也没效果。
问题根源分析
你用的正则 [\\W] 是匹配单个非单词字符(包括+、-、|这些符号)。你的字符串开头就是+,相当于在空字符串和computer之间做了一次分割,自然就产生了第一个空元素。而split(regex, -1)的作用是保留分割后末尾的空元素(比如如果字符串结尾是+,会保留最后一个空元素),对开头的空元素没有影响。
两种有效解决方案
方案1:用\\W+匹配连续分隔符(最简洁)
把正则改成\\W+,表示匹配一个或多个连续的非单词字符。这样不管开头、中间有多少个连续的分隔符,都会被当作一个分隔符处理,开头的分隔符不会生成空元素:
public class Test { public static void main(String args[]) { String ab="+computer-science|lambda+sigma"; String[] lesAndz = ab.split("\\W+"); for(int i=0;i<lesAndz.length;i++){ System.out.println(i+" : ["+lesAndz[i]+"]"); } } }
运行后就能得到你期望的输出:
0 : [computer] 1 : [science] 2 : [lambda] 3 : [sigma]
方案2:精准匹配指定分隔符(更安全)
如果你只需要分割+、-、|这三个符号,而不是所有非单词字符(比如避免分割@、#这类其他符号),可以把正则写成[+-|]+,明确匹配这三个符号的任意连续组合:
String[] lesAndz = ab.split("[+-|]+");
这个写法更贴合你的实际需求,不会误分割其他非单词字符。
方案3:先去除开头的分隔符(兼容旧逻辑)
如果你想保留原来的单个分隔符分割逻辑,只是去掉开头的空元素,可以先把字符串开头的分隔符去掉,再分割:
String trimmed = ab.replaceFirst("^[+-|]+", ""); // 只去掉开头的指定分隔符 String[] lesAndz = trimmed.split("[+-|]");
内容的提问来源于stack exchange,提问作者Ares
相关产品推荐
相关产品推荐

