字符串切分,String和StringUtils的区别

来源:互联网 发布:双色球公式计算法 编辑:程序博客网 时间:2024/05/22 13:40
String的split方法可以按照正则表达式把string数据拆分成数组
如下:
String test1 = "1,2,3";
System.out.println(test1.split(",").length);
结果为3
若test1=“1,2,3,”,结果为3
若test1=“,1,2,3”,结果为4,第一个元素就是空
// Add segments before each match found    while(m.find()) {        if (!matchLimited || matchList.size() < limit - 1) {            String match = input.subSequence(index, m.start()).toString();            matchList.add(match);            index = m.end();        } else if (matchList.size() == limit - 1) { // last one            String match = input.subSequence(index,                                             input.length()).toString();            matchList.add(match);            index = m.end();        }    }    // If no match was found, return this    if (index == 0)        return new String[] {input.toString()};    // Add remaining segment    if (!matchLimited || matchList.size() < limit)        matchList.add(input.subSequence(index, input.length()).toString());  
 
从代码中可以发现下载,根据逗号拆分之后,其实会把逗号之前当成一个空字符串放到matchList中。当字符串处理完之后,matchList中就存了所有的悲切分后的元素。但在方法最后还会对matchList进行验证,即从最后一个元素开始,判断是否为空,若为空就去掉,不为空就不继续往前验证了下载。
// Construct result    int resultSize = matchList.size();    if (limit == 0)        while (resultSize > 0 && matchList.get(resultSize-1).equals(""))            resultSize--;    String[] result = new String[resultSize];    return matchList.subList(0, resultSize).toArray(result)
这也就造成了“1,2,3,”和“,1,2,3”拆分结果的不同。
也是这个原因,造成“,”拆分时,会没有任何数据产生,若是有类似代码下载使用,必须还得校验拆分出来的数据是否可用,否则容易造成异常
如:传递商家id,可能传递多个,利用逗号分隔,结果只传递了逗号,判断有逗号存在,解析出来却没任何数据,直接报错,如下代码就是有问题的
String test1 = “,";
System.out.println(test1.split(",)[0]);
对于这个问题,可以不直接判断是否有逗号存在,而是直接调用split方法,然后再校验拆分出来的数组有没有数据即可
在apache的commons-lang3包中提供了StringUtils的类,此类中也有split方法,而且对于“,1,2,3”这种情况拆分出来的结果是不一样的下载。
在StringUtils类中的split方法,会根据逗号进行拆分,在这个里面也是利用到了list存储拆分结果。但是在拆分开始时,若第一个元素就是逗号,是不会放到list中的,即最后结果中第一个元素不是空,也就跟String的split不一样了。
但是StringUtils还提供了另外一个方法splitPreserveAllTokens下载,这个方法就会保留逗号前后的数据,不管逗号前后是否真的有数据,若是没数据就以空字符串补齐。
 
另外这只是一个字符作为切割串,若是有多个字符作为切割串,那结果就又不一样了。
如字符串“1332”,以“12”作为切割串进行切割。
在利用String的split方法时,会返回原字符串,没有进行切割,是以12作为整体进行match。
而StringUtils的方法,并不是以“12”作为整体,而是查看字符串是否存在“1”或“2”这些字符,切割的意义就跟String有天壤之别了,使用时要注意。
 
可以看看guava里面的拆分,跟String的差不多。另外这个包中对字符串的其他操作也不错,例如:下载
// 把字符串解析成map
String str = "a=1;b=2";
Map<String, String> resultMap = Splitter.onPattern(";").withKeyValueSeparator("=").split(str);
System.out.println(resultMap.toString());

// 把map转成字符串
String resultStr = Joiner.on(";").withKeyValueSeparator("=").join(resultMap);
System.out.println(resultStr);
0 0