Spring 的split()方法源码部分分析

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】
免费领取10G资料包与项目实战视频资料
    public String[] split(String regex, int limit) {

            char ch = 0;

            // if判断的条件有3中:
            // 1、如果 匹配规则regex长度为1 且 不是 ".$|()[{^?*+\\" 中的特殊字符
            // 2、 匹配规则regex长度为2 且 第一个字符为转义字符\,第二个字符不是字母或数字
            // 3、 编码
            // 并给 ch 赋值
            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))
            {

                // off和next 分别表示 截取子串时的上下索引,初始都为0
                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) {
                        // 当 off=next时 截取的是空串
                        list.add(substring(off, next));
                        // 子串截完以后 下次截取的初始索引从next的下一位开始
                        off = next + 1;
                    } else {    // last one

                        list.add(substring(off, value.length));
                        off = value.length;
                        break;
                    }
                }

                if (off == 0)
                    return new String[]{this};

                if (!limited || list.size() < limit)
                    list.add(substring(off, value.length));

                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);
        }

来源:[]()

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring 的split()方法源码部分分析

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏