读书人

Java SE 1.7 API String 的split步骤源

发布时间: 2012-09-16 17:33:17 作者: rapoo

Java SE 1.7 API String 的split方法源代码

public String[] split(String regex, int limit) {

return Pattern.compile(regex).split(this, limit);

? ? }

?

?

public String[] split(String regex) {

? ? ? ? return split(regex, 0);

? ? }

?

?

?

//javase 1.7api中String类的split方法

? ? 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.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);

? ? }


读书人网 >编程

热点推荐