A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NNERO 中级黑马   /  2014-4-27 20:59  /  792 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 NNERO 于 2014-4-28 16:24 编辑
  1. public class Text111
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                
  6.                 String s = "[abc]";
  7.                 String x = "acpplajdkb";
  8.                 String[] strs = x.split(s);
  9.                 System.out.println(strs.length);//输出4,这是为何,切割后 应该只有ppl和jdk2个字符串啊
  10.                 for(String str:strs){
  11.                         System.out.println(str);//输出ppl,和jdk之前,还输出2个空行,这也不明白为何
  12.                 }
  13.         }
  14.       
  15. }
复制代码
如注释中的问题,这个切割,有些不解,求解!!!

2 个回复

倒序浏览
String s = "[abc]";
这个正则表达式的意思是abc三选一,都可以。
"acpplajdkb"按a或b或c切割
a c ppl a jdk b
这时候有个很有意思的地方,就是字符串前空部分会被切成空,而尾空部分不会。
所以就是:
空字符串1a空字符串2 c ppl a jdk b
这样的四个部分。
产生这种情况的具体原因,我查了一下API,里面对split的方法解释是这样的:
根据匹配给定的正则表达式来拆分此字符串。
此方法返回的数组包含此字符串的子字符串,每个子字符串都由另一个匹配给定表达式的子字符串终止,或者由此字符串末尾终止。数组中的子字符串按它们在此字符串中出现的顺序排列。如果表达式不匹配输入的任何部分,那么所得数组只具有一个元素,即此字符串。
重点部分我标红色了,这一句也就是解释这个现象的关键。
就是,这个方法拆出来的子字符串,结尾都是匹配表达式的子字符串(用来切的那个s),或者是字符串末尾。
在还没运行到字符串末尾的时候,比如你这个运行中前面的a和c,这两个切割位置既然不是原字符串末尾,那么就可以当作匹配切割出的子字符串位置来用。这样运行的结果就是,产生了两个空子字符串,被数组存起来了。
到了尾巴上的b,因为已经判断到了原字符串的末尾,那么就不会产生新的子字符串了。
而且我发现在尾巴上,多次切割也不会产生新子字符串。
比如说"acpplajdkb",后面再多加几个b变成"acpplajdkbbbbb"这样,也不会多增加空字符串。

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
kuroro自走核炮 发表于 2014-4-27 21:27
String s = "[abc]";
这个正则表达式的意思是abc三选一,都可以。
"acpplajdkb"按a或b或c切割

原来如此,我懂了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马