String s = "abc";
String[] ss = s.split("");
System.out.println(ss.length);
System.out.println(ss[0]);输出救过是4和"空",这个空是哪里来的?什么都不写的split("")是个什么样的正则?

解决方案 »

  1.   

    String s = "abc";
    String[] ss = s.split("a");
    System.out.println(ss.length);
    System.out.println(ss[0]);//输出""
    System.out.println(ss[ss.length - 1]);//输出abc String s = "abc";
    String[] ss = s.split("c");
    System.out.println(ss.length);
    System.out.println(ss[0]);//输出ab
    System.out.println(ss[ss.length - 1]);//输出ab比较以上两段代码,如果第被split的字符串的第一个字符就匹配,则会输出一个最前面的"",如果最后一个匹配,不会输出最后的"",因为此时也到达字符串尾部
      

  2.   

    查了String和Pattern的源码,如果输入的split参数长度小于1将无法进入split的字符串处理:
     if (((regex.count == 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, count));
                        off = count;
                        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, count));            // 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);
    未被处理的regex直接送入Pattern的complie(regex),将导致pattern被置空,并使用上次成功使用的pattern:
        private Pattern(String p, int f) {
            pattern = p;
            flags = f;        // to use UNICODE_CASE if UNICODE_CHARACTER_CLASS present
            if ((flags & UNICODE_CHARACTER_CLASS) != 0)
                flags |= UNICODE_CASE;        // Reset group index count
            capturingGroupCount = 1;
            localCount = 0;        if (pattern.length() > 0) {
                compile();
            } else {
                root = new Start(lastAccept);
                matchRoot = lastAccept;
            }
        }