java split 末尾空值被截断了

在使用split 分离数据的时候,发现末尾空值被截断了

初始

public static void main(String args[]) {
    String filePath = "中情局RSM01|||||1|121000000000012953730068|武清区||";
    List<String> datas = Arrays.asList(filePath.split("\\|"));
    System.out.println(datas.size() + " "+JSON.toJSONString(datas));
    filePath = "中情局RSM02|||||2|121000000000000106661319|武清区||121000000000012953720761";
    datas = Arrays.asList(filePath.split("\\|"));
    System.out.println(datas.size() + " "+JSON.toJSONString(datas));
}

结果:

8 ["中情局RSM01","","","","","1","121000000000012953730068","武清区"]
10 ["中情局RSM02","","","","","2","121000000000000106661319","武清区","","121000000000012953720761"]

末尾为空的被截断了

处理

笨方法:

 既然被截断了,那我尾巴加个空格,这样就都有值。

 代码里面加个判断,如果尾巴是空的,再加个空格,分离后再进行替换。

public static void main(String args[]) {
        String filePath = "中情局RSM01|||||1|121000000000012953730068|武清区||";
        List<String> datas = splitData(filePath);
        System.out.println(datas.size() + " "+JSON.toJSONString(datas));
        filePath = "中情局RSM02|||||2|121000000000000106661319|武清区||121000000000012953720761";
        datas = splitData(filePath);
        System.out.println(datas.size() + " "+JSON.toJSONString(datas));
    }

    private static List<String> splitData(String str){
        if(str.endsWith("|")){
            str = str.concat(" "); // 设置为空,让对象读取到,最后分离后,再替换为空
            List<String> data = new ArrayList<>(Arrays.asList(str.split("\\|")));
            data.set(data.size() -1, "");
            return data;
        }
        return Arrays.asList(str.split("\\|"));
    }

结果:

10 ["中情局RSM01","","","","","1","121000000000012953730068","武清区","",""]
10 ["中情局RSM02","","","","","2","121000000000000106661319","武清区","","121000000000012953720761"]

符合目标。但是想想不对,在写这个方法的时候,肯定是有考虑到这情况的,去看看源码。

split(String regex, int limit) 

把说明用谷歌翻译了下,

     * 围绕给定的匹配拆分此字符串
     * <a href="../util/regex/Pattern.html#sum">正则表达式</a>。
     *
     * <p> 此方法返回的数组包含此的每个子字符串
     * 由与给定匹配的另一个子字符串终止的字符串
     * 表达式 or 以字符串结尾结束。中的子串
     * 数组按照它们在此字符串中出现的顺序排列。如果
     * 表达式与输入的任何部分都不匹配,则结果数组
     * 只有一个元素,即这个字符串。
     *
     * <p> 当此开头有正宽度匹配时
     * string 然后在开头包含一个空的前导子字符串
     * 结果数组。然而,开头的零宽度匹配
     * 永远不会产生这样的空前导子字符串。
     *
     * <p> {@code limit} 参数控制的次数
     * 模式被应用,因此会影响结果的长度
     * 大批。如果限制 <i>n</i> 大于零,则模式
     * 最多应用 <i>n</i>&nbsp;-&nbsp;1 次,数组的
     * 长度不会大于<i>n</i>,并且是数组的最后一项
     * 将包含最后一个匹配分隔符之外的所有输入。如果 <i>n</i>
     * 为非正数,则该模式将被应用多次
     * 可能,并且数组可以有任意长度。如果 <i>n</i> 为零,则
     * 模式会被应用尽可能多的次数,数组可以
     * 具有任意长度,并且尾随的空字符串将被丢弃。

         使用默认的split方法时,会默认丢弃字符串末尾的空值,而字符串中间的空值则会作为数组中的一项数据,不会被丢弃。

         使用split(String regex, int limit),第二个参数limit,此值默认为0,丢弃末尾空数据。

而limit大于0时,代表分割字符串后数组的最大长度,当limit小于0时,代表获取数组所有值,不会丢弃末尾空值。

       

使用plit(String regex, int limit)

   public static void main(String args[]) {
        String filePath = "中情局RSM01|||||1|121000000000012953730068|武清区||";
        List<String> datas = Arrays.asList(filePath.split("\\|", -1));
        System.out.println(datas.size() + " "+JSON.toJSONString(datas));
        filePath = "中情局RSM02|||||2|121000000000000106661319|武清区||";
        datas = Arrays.asList(filePath.split("\\|", -2));
        System.out.println(datas.size() + " "+JSON.toJSONString(datas));
    }

结果:

10 ["中情局RSM01","","","","","1","121000000000012953730068","武清区","",""]
10 ["中情局RSM02","","","","","2","121000000000000106661319","武清区","",""]

总结:

        使用split分离字符的时候,如果末尾有空值的,用split(String regex, int limit)。这上面也可以看出如果使用的方法不是自己想要的,先去看看源码,看看相关方法的实现,看看能不能满足需求,还不行,再考虑自己想法子去处理。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天狼1222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值