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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值