我认为String的split方法很常用,您是否遇到过以下情况:
请考虑以下代码的执行结果
publicstaticvoidmain (字符串[ ] args ) {//todo auto-generated method stub
String str1='a、b、c、a ';
String str2='a,b,c,
String str3='a,b,c,
String[] s1=str1.split (,);
String[] s2=str2.split (,);
String[] s3=str3.split (,);
system.out.println(str1长度: ) s1.Length );
system.out.println(str2长度: ) S2.Length );
system.out.println(str3长度: ) S3.Length );
}
执行结果:
为什么会出现这样的结果呢? 我找了API找到了解决方法
解决方法:
通过API可以看到,默认情况下,我们常用的split方法传递0。 解决str2输出空的解决方案是,传递的第二个参数是负数
publicstaticvoidmain (字符串[ ] args ) {//todo auto-generated method stub
String str1='a、b、c、a ';
String str2='a,b,c,
String str3='a,b,c,
String[] s1=str1.split (,);
String[] s2=str2.split ('、'、-1);
String[] s3=str3.split ('、'、-1);
system.out.println(str1长度: ) s1.Length );
system.out.println(str2长度: ) S2.Length );
system.out.println(str3长度: ) S3.Length );
}
根据搜索API,String类有两种精灵重载方法
1 .公共字符串[ ] split (字符串regex ) )。
根据给定正则表达式的匹配项拆分此字符串。
此方法的作用类似于使用指定的表达式和限制参数0调用双参数的splet方法。 因此,结果数组不包含末尾的空字符串。
例如,字符串“boo:and:foo”使用这些表达式生成以下结果:
Regex的结果
:
{ 'boo '、' and '、' foo' }
o
{ 'b '、'、'、' :and:f' }
参数: regex-分隔符正则表达式返回一个字符串数组,它是根据指定正则表达式的匹配项拆分此字符串所确定的抛出。
2 .公共字符串[ ] split (字符串regex,intlimit ) )。
根据匹配的正则表达式拆分此字符串。
此方法返回的数组包含此字符串的子字符串。 每个子字符串以与指定表达式匹配的另一个子字符串结束,或者以此字符串的末尾结束。 数组中的子字符串按其在该字符串中出现的顺序排列。 如果表达式与输入的任何部分都不匹配,则结果数组中只有一个元素,即此字符串。
由于limit参数控制模式的应用次数,因此会影响数组的生成长度。 如果此限制n大于0,则模式最多应用n-1次,数组的长度不应大于n,数组的最后一个条目包含超过最后匹配分隔符的所有输入。 如果n不为正,模式将应用尽可能多的次数,并且数组可以是任意长度。 如果n为0,则模式将应用尽可能多的次数,数组可以是任意长度,并丢弃末尾的空字符串。
例如,在字符串“boo:and:foo”中使用这些参数可以获得以下结果:
regex限制的结果
:
2
{ 'boo ',' and:foo' }
:
5
{ 'boo '、' and '、' foo' }
:
-2
{ 'boo '、' and '、' foo' }
o
5
{ 'b '、'、'、' :and:f '、'、'、' }
o
-2
{ 'b '、'、'、' :and:f '、'、'、' }
o
0
{ 'b '、'、'、' :and:f' }
调用此方法的str.split(regex,n )的格式与以下表达式的结果完全相同:
参数: regex-分隔符正则表达式limit-结果阈值。 如上所述返回。 字符串数组。 这是根据指定正则表达式的匹配项拆分此字符串所确定的抛出。