Java字符串split方法的坑 2022-04-23 04:54 462阅读 0赞 先来看几行简单的Java代码,如下: System.out.println("1,2".split(",").length); System.out.println("1,2,".split(",").length); System.out.println("".split(",").length); System.out.println(",".split(",").length); 接下来,猜一下各行的输出结果。OK,下面给出真正的运行结果: 2 2 1 0 这里先给出jdk相关源码,再来对应分析各自的输出: public String[] split(String regex, int limit) { /* fastpath if the regex is a (1)one-char String and this character is not one of the RegEx's meta characters ".$|()[{^?*+\\", or (2)two-char String and the first char is the backslash and the second is not the ascii digit or ascii letter. */ char ch = 0; if (((regex.value.length == 1 && ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) || (regex.length() == 2 && regex.charAt(0) == '\\' && (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 && ((ch-'a')|('z'-ch)) < 0 && ((ch-'A')|('Z'-ch)) < 0)) && (ch < Character.MIN_HIGH_SURROGATE || ch > Character.MAX_LOW_SURROGATE)) { int off = 0; int next = 0; boolean limited = limit > 0; ArrayList<String> list = new ArrayList<>(); while ((next = indexOf(ch, off)) != -1) { if (!limited || list.size() < limit - 1) { list.add(substring(off, next)); off = next + 1; } else { // last one //assert (list.size() == limit - 1); list.add(substring(off, value.length)); off = value.length; break; } } // If no match was found, return this if (off == 0) return new String[]{this}; // Add remaining segment if (!limited || list.size() < limit) list.add(substring(off, value.length)); // Construct result int resultSize = list.size(); if (limit == 0) { while (resultSize > 0 && list.get(resultSize - 1).length() == 0) { resultSize--; } } String[] result = new String[resultSize]; return list.subList(0, resultSize).toArray(result); } return Pattern.compile(regex).split(this, limit); } 1.**第一行**代码的输出结果肯定没什么问题,字符串 "1,2" 以 "," 分隔,结果很直观的是 **\["1", "2"\]**,**length=2**。 2.**第二行**代码的输出结果,可能大家有人认为是length=3才对,因为字符串 "1,2," 以 "," 分隔,结果应该是 \["1", "2", ""\],length=3;其实不然,jdk在split处理的时候,确实会先生成一个集合list = \["1", "2", ""\],但之后却会循环判断末位元素是否为空字符串(即末位元素length=0),因此集合最终会变成 **\["1", "2"\]**,**length=2**。具体判断如下: while (resultSize > 0 && list.get(resultSize - 1).length() == 0) { resultSize--; } 3.**第三行**代码的输出结果,数组 **\[""\]**,**length=1**。与其他三种情况不同,空字符串 "" 中不包含regex字符串 ",",所以代表没有匹配上的子串(off=0),则返回字符串本身。具体处理如下: // If no match was found, return this if (off == 0) return new String[]{this}; 4.**第四行**代码的输出结果,可能也有部分人认为结果应是length=2,因为字符串 "," 以 "," 分隔,结果应该是 \["", ""\],length=2;其实亦不然,与第2行同样的原理,最终将list=\["", ""\] 处理为空集合 **\[\]**,**length=0**。 以上,系本文分享的split的一个小坑;除此之外,另一个需要注意的地方,split方法的参数是正则表达式而非一般字符串,所以在处理正则转义字符和特殊字符时留意即可。
相关 Java的split方法使用多种分隔符切分字符串 Java的split方法使用多种分隔符切分字符串 方法一: 多个分隔符使用’|'分开,例如: String str = "abc;123,456?999|h Love The Way You Lie/ 2022年09月09日 11:43/ 0 赞/ 379 阅读
相关 java split 分割字符串 split方法: 将一个字符串分割成多个子字符串,然后将结果作为字符串数组返回。 示例: public class JavaStringSplitEmp { 电玩女神/ 2022年07月12日 22:36/ 0 赞/ 435 阅读
相关 Java之split的坑 String的split方法经常被用来分割字符串,获得字符串数组。比如 String str = "9 - 34 -23"; String[] res = s ╰+哭是因爲堅強的太久メ/ 2022年06月08日 04:43/ 0 赞/ 181 阅读
相关 注意java 字符串split的坑哦 System.out.println(":ab:cd:ef::".split(":").length);//末尾分隔符全部忽略 System.out.pri 素颜马尾好姑娘i/ 2022年05月17日 05:12/ 0 赞/ 245 阅读
相关 Java字符串split方法的小陷阱 今天在写一个Java字符串切分程序时,发现切分后的计数一直有问题,调了半天才找到原因。。。 下面先来看一个问题:有字符串str=“string split test” ,使用 梦里梦外;/ 2022年05月12日 00:54/ 0 赞/ 476 阅读
相关 Java字符串split方法的坑 先来看几行简单的Java代码,如下: System.out.println("1,2".split(",").length); System.out.prin r囧r小猫/ 2022年04月23日 04:54/ 0 赞/ 463 阅读
相关 Java字符串分隔方法split实践 在工作中,有字符串分隔很自然也一直用String的split方法,但直到今天,我竟然踩到了一个坑。 一.正常的分隔,分隔符是“:” package 末蓝、/ 2022年04月11日 08:43/ 0 赞/ 546 阅读
相关 Java使用String对象的split()方法分割字符串 Java使用String对象的split()方法分割字符串 分割字符串 1. Java中,按某个字符分割字符串使用的是String对象的`split()`方法,返 布满荆棘的人生/ 2022年03月17日 07:19/ 0 赞/ 650 阅读
相关 Java 利用 split 方法切割字符串 之前经常遇到切割字符串的情况,这里把常见的场景总结一下: 1 // 以空格切割 2 String s1 = "dew q 朴灿烈づ我的快乐病毒、/ 2021年12月03日 23:17/ 0 赞/ 634 阅读
相关 Java 中的 Split() 字符串方法及示例 string split() 方法在给定正则表达式的匹配项周围断开给定字符串。 例如: 输入字符串:016-78967 正则表达式: - 输出:{“016”,“78... 朱雀/ 2021年08月14日 09:31/ 0 赞/ 11364 阅读
还没有评论,来说两句吧...