Java中的String.split()方法
public String[] split(String regex)
其实是调用 limit=0 时的String的同名两参数方法:
public String[] split(String regex,int limit)
因此,所得字符数组是包括开头空字符串,但不包括结尾空字符串的,
举个例子:
public static void main(String[] args){
String str = "/0/1/2/3/4/5/6/7/";
String[] parts = str.split("/");
System.out.println(Arrays.toString(parts));
}
输出是:
[, 0, 1, 2, 3, 4, 5, 6, 7]
如果想到得到开头和结尾的空字符串,将limit设置为负数即可:
public static void main(String[] args){
String str = "/0/1/2/3/4/5/6/7/";
String[] parts2 = str.split("/",-1);
System.out.println(Arrays.toString(parts2));
}
输出结果:
[, 0, 1, 2, 3, 4, 5, 6, 7, ]
根据JDK文档可知,"limit控制模式应用的次数,因此影响所得数组的长度",那么limit为正数是什么情况呢?
当limit>0时,"则模式将被最多应用 limit - 1 次,数组的长度将不会大于 limit,而且数组的最后一项将包含所有超出最后匹配的定界符的输入".
也就是说,字符串将对regex正则表达式从头到尾最多匹配limit-1次,经过limit-1次匹配剩余的字符串会被保存在数组的第limit项:
还是举例说明:
public static void main(String[] args){
String str = "/0/1/2/3/";
String[] parts1 = str.split("/",1);
String[] parts2 = str.split("/",2);
String[] parts3 = str.split("/",3);
String[] parts4 = str.split("/",4);
String[] parts5 = str.split("/",5);
String[] parts6 = str.split("/",6);
System.out.println("limit=1:" +Arrays.toString(parts1));
System.out.println("limit=2:" +Arrays.toString(parts2));
System.out.println("limit=3:" +Arrays.toString(parts3));
System.out.println("limit=4:" +Arrays.toString(parts4));
System.out.println("limit=5:" +Arrays.toString(parts5));
System.out.println("limit=6:" +Arrays.toString(parts6));
}
输出:
limit=1:[/0/1/2/3/]
limit=2:[, 0/1/2/3/]
limit=3:[, 0, 1/2/3/]
limit=4:[, 0, 1, 2/3/]
limit=5:[, 0, 1, 2, 3/]
limit=6:[, 0, 1, 2, 3, ]
可以看到,limit=1时其实是没有做匹配的.
汇总一下,可以更清楚地对比limit在不同参数下的差异:
public static void main(String[] args){
String str = "/0/1/2/3/";
String[] parts = str.split("/");
String[] parts2 = str.split("/",-1);
String[] parts3 = str.split("/",1);
String[] parts4 = str.split("/",2);
String[] parts5 = str.split("/",3);
String[] parts6 = str.split("/",4);
String[] parts7 = str.split("/",5);
String[] parts8 = str.split("/",6);
System.out.println("原始字符串:" + str);
System.out.println("limit=0:" + Arrays.toString(parts));
System.out.println("limit=-1:" +Arrays.toString(parts2));
System.out.println("limit=1:" +Arrays.toString(parts3));
System.out.println("limit=2:" +Arrays.toString(parts4));
System.out.println("limit=3:" +Arrays.toString(parts5));
System.out.println("limit=4:" +Arrays.toString(parts6));
System.out.println("limit=5:" +Arrays.toString(parts7));
System.out.println("limit=6:" +Arrays.toString(parts8));
}
输出:
原始字符串:/0/1/2/3/
limit=0:[, 0, 1, 2, 3]
limit=-1:[, 0, 1, 2, 3, ]
limit=1:[/0/1/2/3/]
limit=2:[, 0/1/2/3/]
limit=3:[, 0, 1/2/3/]
limit=4:[, 0, 1, 2/3/]
limit=5:[, 0, 1, 2, 3/]
limit=6:[, 0, 1, 2, 3, ]
总结:
String.split(String regex)正则匹配出的字符数组默认包含开头空字符串,不包含结尾空字符串;
String.split(String regex,-1)匹配出的字符数组包含开头和结尾的空字符串;