• java split 末尾空值被截断了


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

    初始

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

    结果:

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

    末尾为空的被截断了

    处理

    笨方法:

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

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

    1. public static void main(String args[]) {
    2. String filePath = "中情局RSM01|||||1|121000000000012953730068|武清区||";
    3. List datas = splitData(filePath);
    4. System.out.println(datas.size() + " "+JSON.toJSONString(datas));
    5. filePath = "中情局RSM02|||||2|121000000000000106661319|武清区||121000000000012953720761";
    6. datas = splitData(filePath);
    7. System.out.println(datas.size() + " "+JSON.toJSONString(datas));
    8. }
    9. private static List splitData(String str){
    10. if(str.endsWith("|")){
    11. str = str.concat(" "); // 设置为空,让对象读取到,最后分离后,再替换为空
    12. List data = new ArrayList<>(Arrays.asList(str.split("\\|")));
    13. data.set(data.size() -1, "");
    14. return data;
    15. }
    16. return Arrays.asList(str.split("\\|"));
    17. }

    结果:

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

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

    split(String regex, int limit) 

    把说明用谷歌翻译了下,

    1. * 围绕给定的匹配拆分此字符串
    2. *
    3. *

      此方法返回的数组包含此的每个子字符串

    4. * 由与给定匹配的另一个子字符串终止的字符串
    5. * 表达式 or 以字符串结尾结束。中的子串
    6. * 数组按照它们在此字符串中出现的顺序排列。如果
    7. * 表达式与输入的任何部分都不匹配,则结果数组
    8. * 只有一个元素,即这个字符串。
    9. *
    10. *

      当此开头有正宽度匹配时

    11. * string 然后在开头包含一个空的前导子字符串
    12. * 结果数组。然而,开头的零宽度匹配
    13. * 永远不会产生这样的空前导子字符串。
    14. *
    15. *

      {@code limit} 参数控制的次数

    16. * 模式被应用,因此会影响结果的长度
    17. * 大批。如果限制 n 大于零,则模式
    18. * 最多应用 n - 1 次,数组的
    19. * 长度不会大于n,并且是数组的最后一项
    20. * 将包含最后一个匹配分隔符之外的所有输入。如果 n
    21. * 为非正数,则该模式将被应用多次
    22. * 可能,并且数组可以有任意长度。如果 n 为零,则
    23. * 模式会被应用尽可能多的次数,数组可以
    24. * 具有任意长度,并且尾随的空字符串将被丢弃。

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

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

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

           

    使用plit(String regex, int limit)

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

    结果:

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

    总结:

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

  • 相关阅读:
    【毕业设计】基于STM32的智能药箱系统设计与实现 - 物联网 单片机
    MFC|按钮的自绘
    AST的语义特征和结构特征
    Java-KoTime:热更新-不重启替换代码
    pringboot面向爱宠人群的宠物资讯系统36as8计算机毕业设计-课程设计-期末作业-毕设程序代做
    leetcode 热题 100
    Unity 热更--AssetBundle学习笔记 0.8
    docker创建容器相关命令【详细版】
    基于C#实现Windows服务
    c++生成随机数(猜数字游戏)
  • 原文地址:https://blog.csdn.net/qq_35461948/article/details/126616391