Split的入参
先去String中看看Split的函数的定义
*
* @param regex
* the delimiting regular expression
*/
public String[] split(String regex) {
return split(regex, 0);
}
可以看到其入参并不是你要作为标记的String字符串,而是一个正则表达式,而且其调用了另外一个函数,进入调用函数的细节
char ch = 0;
if (
//if判断第一种情况:判断输入
(
//第一种情况的判断1
(
//判断是不是仅输入了一个字符
regex.value.length == 1 &&
//输入字符不为以下其中一个
".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1
)
//第一种情况的判断2
||
(
//输入字符为两个
regex.length() == 2 &&
//第一个Char为两个转义
regex.charAt(0) == '\\' &&
//第二个char字符不为0-9
(((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
//第二个char字符不为a-z
((ch-'a')|('z'-ch)) < 0 &&
//第二个char字符为A-Z
((ch-'A')|('Z'-ch)) < 0
)
)
&&
//第二种情况:为合法的char字符
(ch < Character.MIN_HIGH_SURROGATE || ch > Character.MAX_LOW_SURROGATE)
)
{
//以ch字符为关键字进行偏移分割法
....
}else {
//以输入字符为正则表达式进行分割法
....
}
通过总结发现
if判断为true的条件
- 输入字符为一位时,不为「.$|」等正则字符
- 输入字符为两位时,第一位为两个转义字符,第二位不为0-9或a-Z
满足以上两个条件就进行正常字符分割,否则进行正则表达式匹配
以「.」 分割
所以说以点分割要避开正则表达式的判断,需要用两个转义字符,从转义字符上理解
- 第一个转义字符用来转义第二个转义字符
- 第二个转义字符用来转义点符号
例子
String str = "com.alanli.io"
String[] strArray = str.split("\\.");
//String[] strArray = str.split("."); //错误的方法进入了正则分割