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==]
         */
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值