Javasplit⽅法详细讲解
今天是圣诞节,我是中国⼈,⽆视圣诞节。
⽂章可能有点长,看下来必定有所收获。
没有学过正则表达式的去b站看,⼀个半⼩时应该可以看完,要看请点
这是必备的前置技能,不懂得话没法真正明⽩split⽤法
⽅法1:split(String regex)
split()⽅法:分割字符串,参数regex称为分割符,可以使⽤正则表达式来表⽰
public String[]split(String regex){
return split(regex,0);
}
⼊门案例1
分割符可以是任意字母,符号,数字,字符串等等,这个基本都会
@Test
public void splitDemo1(){
String str="1a2";
String[] split = str.split("a");
//split:{"1","2"}
for(int i =0; i < split.length; i++){
sofa的音标System.out.println(split[i]);
}
}
运⾏结果
1
2
注意:String类型是不可变的!分隔符会把字符串拆成若⼲个⼦字符串,然后⽣成⼀个String数组⼊门案例2
分割符可以⽤正则表达式来表⽰
@Testelisabeth harnois
public void splitDemo2(){
String str="a33b444c555d";
//正则表达式中\d+表⽰⼀个或多个数字,java中\\表⽰⼀个普通\
//String[] split = str.pile("\\d+").toString());
//两种写法都是⼀样的,下⾯写法简洁
String[] split = str.split("\\d+");
for(int i =0; i < split.length; i++){
System.out.println(split[i]);
}
}
运⾏结果
a
b
c
d
⼊门案例3
正则表达式篇中讲过,正则表达式中有⼀些特殊的字符,这些字符本⾝有特殊含义,加了\后表⽰仅匹配字符本⾝
java中两个反斜杠才表⽰⼀个\
@Test
public void splitDemo3(){
String str="aaa|bbb|ccc";
//使⽤|作为分隔符,其余特殊字符同理
String[] split = str.split("\\|");
for(int i =0; i < split.length; i++){
System.out.println(split[i]);
}
}
运⾏结果
aaa
bbb
ccc
⼊门案例4
分隔符可以有多个,⽤|隔开,|分⽀结构:左右两边表达式之间"或"关系,匹配左边或者右边
这是属于上篇的内容,这⾥复习⼀下。正则的语法规则可以在这⾥灵活运⽤
@Test
public void splitDemo4(){
String str="aaa,bbb#ccc";
//使⽤,和#分割字符串
String[] split = str.split(",|#");
for(int i =0; i < split.length; i++){
System.out.println(split[i]);
}
}
运⾏结果
aaa
bbb
ccc
分隔符三个特殊位置
⼊门案例的分隔符都是在字符串中间,⾮常好切割,但是如果出现以下任意其⼀,该怎么分割?
1.字符串开头有分隔符
2.分隔符相互紧挨着
3.字符串最尾部有分割符
总结:
字符串开头出现的分隔符将分隔出⼀个空字符串以及其余部分的正常分隔
字符串最尾部出现的分隔符,末尾会分割出⼀个空字符串
分隔符紧挨着,分隔符之间也会分割出⼀个空字符串
特殊案例1
分隔符紧挨着,分隔符之间也会分割出⼀个空字符串
@Test
public void demo(){
String str="19997";
String[] split = str.split("9");
minesweeper
for(int i =0; i < split.length; i++){
System.out.println(split[i]);
}
}
两个9之间会分割出⼀个空字符串,所以会出现两个空字符串,前⾯的1和7正常分割
特殊案例2
字符串开头出现的分隔符将分隔出⼀个空字符串以及其余部分的正常分隔
字符串最尾部出现的分隔符,其余部分正常分隔,末尾会分割出⼀个空字符串
@Test
public void demo(){
String str="yky";
String[] split = str.split("y");
System.out.println(split.length);
System.out.String(split));
}
运⾏结果:
2
[, k]
//按照我们的结论,返回的数组应该是["",k,""]才对
胆怯是什么意思
其实不是结论错了,⽽是参数limit的问题,接下来
点进去split⽅法查看,发现调⽤的是另⼀个重载⽅法split(String regex, int limit)
分割时末尾的字符串被丢弃了
称呼英语public String[]split(String regex){
return split(regex,0);
//3.如果 n = 0,匹配到多少次就切割多少次,数组可以是任何长度,并且结尾空字符串将被丢弃。
}
⽅法2:split(String regex,int limit)
public String[]split(String regex){
plainfield
return split(regex,0);
}
一对一英语口语培训
可以看出只填⼀个正则表达式的话,limit默认是0,regex表⽰正则表达式,limit参数控制分割的次数limit⽤法:
1.如果 limit > 0,(从左到右)最多分割 n - 1 次,数组的长度将不会⼤于 n,结尾的空字符串不会丢弃
2.如果 limit < 0,匹配到多少次就分割多少次,⽽且数组可以是任何长度。结尾的空字符串不会丢弃
3.如果 limit = 0,匹配到多少次就分割多少次,数组可以是任何长度,并且结尾空字符串将被丢弃。也就是说,使⽤split⽅法时,如果只填⼀个正则表达式,结尾空字符串将被丢弃
看看源码⼤概怎么说的
ArrayList<String> matchList =new ArrayList<>();
//......
wirelesslan
int resultSize = matchList.size();
if(limit ==0)
while(resultSize >0&& (resultSize-1).equals(""))
resultSize--;
String[] result =new String[resultSize];
//...
先从ArrayList的长度开始遍历,如果发现是空字符串,则长度-1,该长度也等于字符串数组的长度
进阶案例:
火药阴谋limit>0限制分割次数
1.如果 limit > 0,(从左到右)最多分割 limit - 1 次,数组的长度将不会⼤于limit,结尾的空字符串不会丢弃limit=1,分割0次,即不分割,将原字符串装进数组并返回
limit如果太⼤超出了匹配次数,匹配到多少次就分割多少次
String[] split ="abc".split("b",999);//limit=999,但是b只匹配到⼀次,所以只能分割⼀次
//split:{"a","c"}
String[] split2 ="abc".split("b",1);//不切割
//split2:{"abc"}
结尾的空字符串不会丢弃
@Test
public void demo1(){
//limit=3,切割2次,末尾会分割出⼀个""空字符串
String[] split ="abcb".split("b",3);
System.out.println(split.length);//数组长度是3
//split:{"a","c",""}
}
limit<0不限制分割次数
2.如果 limit < 0,匹配到多少次就分割多少次,⽽且数组可以是任何长度。结尾的空字符串不会丢弃
limit=0不限制分割次数
这个是最常⽤的,要注意结尾的空字符串将会丢弃
使⽤o取切割"boo:and:foo",分割后得到数组的长度是3,两个空字符串被丢弃
特殊案例3(字符串不包含分隔符)
当字符串不包含分隔符时,返回数组只包含⼀个元素(该字符串本⾝)
李阳疯狂英语口语@Test
public void demo2(){
String str= "abcde";
String[] split = str.split("f",-1);
//split:{"abcde"}
System.out.println(split.length); //1
}
特殊案例4(字符串只含有分隔符本⾝)
字符串只含有分隔符本⾝,这种切割没啥意义,但还是测试下吧
切割出三个空字符串,开头结尾,相连的地⽅各⼀个空字符串
limit=0时,空字符会被丢弃,返回空数组,长度为0
⽆聊案例1(切割空字符串)
经过测试,分隔符是空字符串""还是任意正则表达式,都会返回带空字符串的数组(空字符串也是字符串)
⽆聊案例2(分隔符是空字符串)
这种切法⾮常奇怪,字符串的最末尾会分割出⼀个"",要去掉的话limit=0即可
@Test
public void demo2(){
String str="abc";
String[] split = str.split("",-1);
System.out.println(split.length);
}
练习
截取⾃jdk源码,Regex分隔符,limit取值,Result截取后的数组