您当前的位置: 首页 >  Java

梁同学与Android

暂无认证

  • 4浏览

    0关注

    618博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

梁同学与Android 发布时间:2019-07-31 18:18:16 ,浏览量:4

文章目录
    • 1.举例说明
    • 2.split源码分析
    • 3.API原解
    • 4.regex参数API原解
    • 5.limit参数介绍
    • 6.结果的验证
    • 7.此方法的使用

1.举例说明

(例子来自于博主:https://blog.csdn.net/java_zhangshuai/article/details/80086857)

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表示 空格,回车,换行等空白符 +号表示一个或多个的意思 |表示分隔符 使用的时候记得加上两个斜杠哦

参考博客:https://blog.csdn.net/java_zhangshuai/article/details/80086857

关注
打赏
1660730345
查看更多评论
立即登录/注册

微信扫码登录

0.1214s