Java字符串的split(String str)方法空串的问题
String strs[] = “SS1BB2CC3”.split(“\\D+”);
1 public static String Test(){ 2 Date d = new Date(milli); 3 String strs[] = "SS1BB2CC3".split("\\D+"); 4 5 for (int i = 0; i < strs.length; i++) { 6 System.out.println(strs[i]); 7 8 } 9 return null; 10 }
结果如下
1 2 3
在1上面有一个看不见的空串。
大概可以猜测得到,split的行为,比如下面有一个串:
“,1,2,3”.split(“,”);
结果是
“”
1
2
3
只能说,这行为太jb傻了吧!无法忍受!算法思路可能是遇到,就把前面的元素扔进数组里,前面没元素就扔个空串进去!最后的3右边没有,就默认当成最后一个字符串扔进数组里。
第一次遍历串“,1,2,3” 数组:
第二次遍历串“1,2,3” 数组:“”
第三次遍历串“2,3” 数组:“” 1
第四次遍历串“3” 数组:“” 1 2
遍历完毕 数组:“” 1 2 3
解决方法是,用于切割的字符左边不能没有元素 ,如果有需要加多个判断:
if (strs[0] == "" ) { do something; } else { do something; }
这也完美解析了为什么用”,”切割,遇到”1,,,,2″会出现3个空串,它的思维是递归的,把第一个,左边元素扔进数组,整个串下一次就变成了”,,,2″,这时第一个逗号左边没有元素,就扔个空串进数组。解决方法如下:
把”,”替换成”,+”,这样遇到一个”,”或者”,,,”都会看成一个整体X,”1,2″和”1,,,2″都会被看成”1X2″,”,” = “,,,” = X,以X切割,X左边的元素是1,就把1扔进数组里,下一次串就变成”2″,最后的元素没有切割符号直接扔数组里。于是strs = [1,2]而不是[1,””,””,””,2]。