java字符串split有很多坑,使用时请小心!

 在使用java中的split按照“\t”,拆分字符串的时候,发现如果最后的几个字段是空,只是用\t分割,是连着的\t的话,就不会被分割,如 “d\tc\te\t\t\t”最后的几个\t就不会被分割,应该是在拆分之前对字符串进行了处理。导致的拆分字段个数错误。

查了一下APi,需要在split中添加参数-1,String[] values = line.split("\t",-1);

imit 参数控制应用模式的次数,从而影响结果数组的长度 

如果限制 n 大于零,那么模式至多应用 n> - 1 次,数组的长度不大于 n,并且数组的最后条目将包含除最后的匹配定界符之外的所有输入 

如果 n 非正,那么将应用模式的次数不受限制,并且数组可以为任意长度 

如果 n 为零,那么应用模式的次数不受限制,数组可以为任意长度,并且将丢弃尾部空字符串  (就是这个原因)

添加上参数-1之后,就正常了。
--------------------- 
看了下jdk里String类的public String[] split(String regex,int limit)方法,

感觉平时不太会用这方法,以为在用正则表达式来拆分时候,如果匹配到的字符是最后一个字符时,会拆分出两个空字符串,

例如"o"split("o",5) or "o"split("o",-2)时候 结果是"" "" 也就是下图中红框里的内容,所以平时一般都用split(String regex) 方法,

其实也就等同于split(String regex,0)方法,把结尾的空字符串丢弃! 

package com.vivo.javatool;

import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;

/**
 * @author WU JIAN HUA
 * @date 2019/4/26
 * @since 2.0
 * description: java字符串split有很多坑,使用时请小心!
 */
public class TestSplit {

    //https://blog.csdn.net/u014481096/article/details/51451153
    public static void main(String[] args) {


        System.out.println(":ab:cd:ef::".split(":").length);//末尾分隔符全部忽略
        System.out.println(":ab:cd:ef::".split(":",-1).length);//不忽略任何一个分隔符
        System.out.println(StringUtils.split(":ab:cd:ef::",":").length);//最前面的和末尾的分隔符全部都忽略,apache commons
        System.out.println(StringUtils.splitPreserveAllTokens(":ab:cd:ef::",":").length);//不忽略任何一个分隔符 apache commons


        String test001="2;北京鸿元知识产权代理有限公司;检索费;2100;0;6.294455;PCT/CN2012/077798;25852024;20120904;;";
        System.out.println(Arrays.toString(test001.split(";")));
        System.out.println(Arrays.toString(test001.split(";",-1)));

        //split正则表达式+结果阀值2,否则value为base64编码的数据的话其中==会丢失,如appVersion=31105==&imei=865407010000009==
        String nextLine="imei=865407010000009==";
        System.out.println(Arrays.toString(nextLine.split("=")));
        System.out.println(Arrays.toString(nextLine.split("=",-1)));
        System.out.println(Arrays.toString(nextLine.split("=",2)));
        /**
         结果
         4
         6
         3
         6
         [2, 北京鸿元知识产权代理有限公司, 检索费, 2100, 0, 6.294455, PCT/CN2012/077798, 25852024, 20120904]
         [2, 北京鸿元知识产权代理有限公司, 检索费, 2100, 0, 6.294455, PCT/CN2012/077798, 25852024, 20120904, , ]
         [imei, 865407010000009]
         [imei, 865407010000009, , ]
         [imei, 865407010000009==]
         */
    }

}
扫描二维码关注公众号,回复: 10402852 查看本文章
发布了789 篇原创文章 · 获赞 274 · 访问量 327万+

猜你喜欢

转载自blog.csdn.net/earbao/article/details/89556951
今日推荐