Java 分割字符串的方法String.split()底层原理与使用

split()底层原理

1.举例说明

1.最普通的用法

String str1 = "aa,bb";
String[] split1 = str1.split(",");
System.out.println(split1.length);
//这个结果是2,都知道的

2.比较普通的用法

String str2 = "";
String[] split2 = str2.split(",");
System.out.println(split2.length);
//这个结果是1,但部分人会认为这个的结果是0,
//这个为什么是1,我会在后面说

3.看起来比较奇怪的用法

String str3 = ",";
String[] split3 = str3.split(",");
System.out.println(split3.length);
//这个结果是0,但部分人会认为结果是1,部分人会认为结果是2.
//这个又为什么是0,我也会在后面说

2.split源码分析

split方法准确的来说有两个参数(String regex, int limit),只不过平时我们用的,是split的一个重载方法(String regex),默认是把第二个参数设置为0,源码如下:

public String[] split(String regex) {
    return split(regex, 0);
}

public String[] split(String regex, int limit) {
	具体实现...
}

3.API原解

此方法返回的数组包含此字符串的每个子字符串,这些子字符串由给定表达式匹配的另一个子字符串终止,或在字符串结尾处终止,数组中的子字符串按它们在此字符串中出现的顺序排列,如果表达式与输入的任何部分都不匹配,则结果数组只有一个元素,即此字符串。

上面这段话你可能会很蒙,看一下下面的例子你就明白了

注意:(空字符串也是一个字符串)

4.regex参数API原解

将此字符串拆分为给定正则表达式的匹配项。

5.limit参数介绍

api是这样说的:
(1)limit参数控制应用模式的次数,因此影响结果数组的长度
(2)如果限制n大于零,则模式将最多应用n-1次,数组的长度将不大于n,数组的最后一项将包含最后一个匹配分隔符以外的所有输入
(3)如果n为非正数,则模式将被应用尽可能多次,并且数组可以具有任何长度
(4)如果n为零,则将尽可能多次应用该模式,数组可以有任何长度,并且将丢弃尾随的空字符串。

简单的理解为:
limit 参数通过控制分割次数从而影响分割结果
如果传入 limit (limit >0) 那么字符串最多被分割 limit -1 次,分割得到数组长度最大是 limit ,数组的最后一项将包含最后一个匹配分隔符以外的所有输入(这句话的解释看后面的例子,很重要)
如果 limit = -1 将会以最大分割次数分割
如果 limit = 0 将会以最大分割次数分割,但是分割结果会丢弃尾随的所有空字符串

6.结果的验证

(1)我们先介绍一下limit=0的时候

public class split {
	public static void main(String args[]) {
		String line = ",aa,bcd,eef,,ss,";
		String[] split = line.split(",",0);
		System.out.println(split.length);
	}
}

dubug之后
在这里插入图片描述
结果证明,尾随的空字符串被丢弃,那我们继续证明到底是不是所有的尾随字符串都被丢弃

上代码:

public class split {
	public static void main(String args[]) {
		String line = ",aa,bcd,eef,,ss,,";
		String[] split = line.split(",",0);
		System.out.println(split.length);
	}
}

dubug之后
在这里插入图片描述

果然,尽可能大的分割,最后的两个空字符串都被丢弃了

(2)limit=4的时候

public class split {
	public static void main(String args[]) {
		String line = ",aa,bcd,eef,,ss,,";
		String[] split = line.split(",",4);
		System.out.println(split.length);
	}
}

dubug之后
在这里插入图片描述
结果验证了上面的那句话数组的最后一项将包含最后一个匹配分隔符以外的所有输入
因为最多分割limit-1次,所以找到分割到第三次时的",",包含后面的所有输入
在这里插入图片描述

(3)limit=-1的时候

public class split {
	public static void main(String args[]) {
		String line = ",aa,bcd,eef,,ss,,";
		String[] split = line.split(",",-1);
		System.out.println(split.length);
	}
}

dubug之后
在这里插入图片描述
结果证明 limit = -1 将会以最大分割次数分割

7.此方法的使用

如果用“.”作为分隔的话,必须是如下写法:String.split(“\.”),这样才能正确的分隔开,不能用String.split(“.”);
2、如果用“|”作为分隔的话,必须是如下写法:String.split(“\|”),这样才能正确的分隔开,不能用String.split(“|”);
“.”和“|”前面必须加\才可以起到转义的作用。
3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“a=1 and b =2 or c=3”,把三个都分隔出来,可以用String.split(“and|or”);

我们来看个例子:

String words[]=str.split("\\s+|\\."); 

这个是很么意思呢?
使用一个或多个空格分隔和用逗号分隔

解释如下:
s表示 空格,回车,换行等空白符
+号表示一个或多个的意思
|表示分隔符
使用的时候记得加上两个斜杠哦



split方法的使用

split用法

先上一个例子:

1.最普通的用法
		String str1 = "aa,bb";
		String[] split1 = str1.split(",");
		System.out.println(split1.length);
		//这个结果是2,都知道的
2.比较普通的用法
		String str2 = "";
		String[] split2 = str2.split(",");
		System.out.println(split2.length);
		//这个结果是1,但部分人会认为这个的结果是0,
		//这个为什么是1,我会在后面说
3.看起来比较奇怪的用法
		String str3 = ",";
		String[] split3 = str3.split(",");
		System.out.println(split3.length);
		//这个结果是0,但部分人会认为结果是1,部分人会认为结果是2.
		//这个又为什么是0,我也会在后面说

分析

split方法准确的来说有两个参数(String regex, int limit),只不过平时我们用的,是split的一个重载方法(String regex),默认是把第二个参数设置为0,源码如下:

	public String[] split(String regex) {
        return split(regex, 0);
    }
    
    public String[] split(String regex, int limit) {
		具体实现...
	}

参数解释—regex

1.如果表达式不匹配输入的任何内容,返回的数组只具有一个元素,即此字符串。(尤其注意空字符串这种情况,他也是一个字符串)
2.可以匹配的情况下,每一个字符串都由另一个匹配给定表达式的子字符串终止,或者由此字符串末尾终止(数组中的字符串按照他们在此字符串出现的顺序排列)

参数解释—limit

该参数用于控制模式匹配使用的次数,可以影响到数组的长度
1.limit>0:
模式匹配将被最多应用n-1次,数组的长度将不会大于n,数组的最后一项将包含所有超出最后匹配的定界符的输入。
2.limit<0:
模式匹配将应用尽可能多的次数,而且数组的长度是任何长度。
3.lilmit=0:
模式匹配将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。

不同limit值的情况下的split结果验证

假设有字符串aa,bcd,eef,

limit=0,regex=“,”
尾部的逗号,直接被忽略,头部的逗号不会忽略

String line = ",aa,bcd,eef,,,";
String[] split = line.split(",",0);
System.out.println(split.length);//4

limit=2,regex=“,”
总长度被限制成最大2个

String line = ",aa,bcd,eef,,,";
String[] split = line.split(",",2);
System.out.println(split.length);//2

limit=100,regex=“,”
总长度被限制成最大100个
但结果是7个,说明当limit大于0,并且远大于应该有的长度时,头部和尾部的逗号都没有被忽略

String line = ",aa,bcd,eef,,,";
String[] split = line.split(",",100);
System.out.println(split.length);//7

limit=-1,regex=“,”
结果是7个,说明当limit小于0时,头部和尾部的逗号都没有被忽略

String line = ",aa,bcd,eef,,,";
String[] split = line.split(",",100);
System.out.println(split.length);//7

扩展

谷歌的guava包,也有对split的重写,返回的是list数组集合.
具体使用如下:

		<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>24.1-jre</version>
        </dependency>
12345
String line = ",aa,bcd,eef,,,";
List<String> split2 = Splitter.on(",").splitToList(line);
System.out.println(split2.size());//7

根据结果,我们可以看到,谷歌的split默认是头部和尾部的逗号都没有被忽略,相当于java包下split的limit设置为-1

相比下,java包下split的limit默认不写就是0,即头部逗号没有被忽略,而尾部逗号是被忽略的

一定要注意区分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Archie_java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值