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