String.split()方法所得数组不包含结尾空字符串

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)匹配出的字符数组包含开头和结尾的空字符串;






  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值