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 resultMap = Splitter.onPattern(";").withKeyValueSeparator("=").split(str);
System.out.println(resultMap.toString());

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