黑马程序员技术交流社区
标题:
关于正则表达式
[打印本页]
作者:
NNERO
时间:
2014-4-27 20:59
标题:
关于正则表达式
本帖最后由 NNERO 于 2014-4-28 16:24 编辑
public class Text111
{
public static void main(String[] args)
{
String s = "[abc]";
String x = "acpplajdkb";
String[] strs = x.split(s);
System.out.println(strs.length);//输出4,这是为何,切割后 应该只有ppl和jdk2个字符串啊
for(String str:strs){
System.out.println(str);//输出ppl,和jdk之前,还输出2个空行,这也不明白为何
}
}
}
复制代码
如注释中的问题,这个切割,有些不解,求解!!!
作者:
kuroro自走核炮
时间:
2014-4-27 21:27
String s = "[abc]";
这个正则表达式的意思是abc三选一,都可以。
"acpplajdkb"按a或b或c切割
a
c
ppl
a
jdk
b
这时候有个很有意思的地方,就是字符串前空部分会被切成空,而尾空部分不会。
所以就是:
空字符串1
a
空字符串2
c
ppl
a
jdk
b
这样的四个部分。
产生这种情况的具体原因,我查了一下API,里面对split的方法解释是这样的:
根据匹配给定的正则表达式来拆分此字符串。
此方法返回的数组包含此字符串的子字符串,每个子字符串都由另一个匹配给定表达式的子字符串终止
,或者由此字符串末尾终止。数组中的子字符串按它们在此字符串中出现的顺序排列。如果表达式不匹配输入的任何部分,那么所得数组只具有一个元素,即此字符串。
重点部分我标红色了,这一句也就是解释这个现象的关键。
就是,这个方法拆出来的子字符串,结尾都是匹配表达式的子字符串(用来切的那个s),或者是字符串末尾。
在还没运行到字符串末尾的时候,比如你这个运行中前面的a和c,这两个切割位置既然不是原字符串末尾,那么就可以当作匹配切割出的子字符串位置来用。这样运行的结果就是,产生了两个空子字符串,被数组存起来了。
到了尾巴上的b,因为已经判断到了原字符串的末尾,那么就不会产生新的子字符串了。
而且我发现在尾巴上,多次切割也不会产生新子字符串。
比如说"acpplajdkb",后面再多加几个b变成"acpplajdkbbbbb"这样,也不会多增加空字符串。
作者:
NNERO
时间:
2014-4-28 16:23
kuroro自走核炮 发表于 2014-4-27 21:27
String s = "[abc]";
这个正则表达式的意思是abc三选一,都可以。
"acpplajdkb"按a或b或c切割
原来如此,我懂了,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2