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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© never615 中级黑马   /  2014-6-11 13:51  /  1296 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 never615 于 2014-6-11 16:59 编辑

X*X,零次或多次

在ip排序这个练习里面  192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30   

10前面补零留三位之后是010  然后用正则去零, replaceAll("0*(\\d+)","$1")     0*表示0次或者多次啊,  010中 开头的0出现了一次啊,按理说不适用这个规则啊,怎么回事?  毕老师视频里面 说了192前面没零的情况,说了002前面两个零的情况,就是没有提010,前面只有一个零时。。郁闷啊    又想不通了,应该怎么想?还有看看下面代码里面我注释的部分

  1. */
  2.         public static void test_2()
  3.         {
  4.                 String str="192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
  5.                 str=str.replaceAll("(\\d+)","00$1");  
  6.                 str=str.replaceAll("0+(\\d{3})","$1");       //这块老师写的("0*(\\d{3})","$1");  但是我想0010,后面保留三位,前面就剩下一个0了,不符合,0*啊,就写了0+
  7.                 sop(str);
  8.                 String[] arr=str.split(" ");
  9.                 TreeSet<String> ts=new TreeSet<String>();
  10.                 for(String s:arr)
  11.                 {
  12.                         ts.add(s);
  13.                 }
  14.                 for(String s:ts)
  15.                 {
  16.                         sop(s.replaceAll("0*(\\d+)","$1"));  //这块写0+的话,打印结果变成了下面的第二种结果
  17.                 }
  18.         }
复制代码
正确的打印结果         
2.2.2.28.109.90.30
10.10.10.10
102.49.23.13
192.68.1.254

第二结果:
2.2.2.2
8.19.90.30
10.10.10.10
12.49.23.13
192.68.1.254




3 个回复

正序浏览
拿202来说,
如果是用0*(表示0次或多次),则在遇到2时就满足条件(即数字前没有0),将202输出;
如果是用0+(表示1次或多次),则在遇到2时没有满足条件,接着遇到0满足条件,并且0后是没有零了,就输出22,对于第二种情况可以通过加单词边界解决,如sop(s.replaceAll("\\b0+(\\d+)\\b","$1"));
回复 使用道具 举报
Gaara33 发表于 2014-6-11 14:02
0*的意思就是说0出现0次或多次(注意:这个多次也可以是一次),你用0+的话就是一次或多次,那么就是最少一 ...

好吧 多次包括一次的话就明白了
X+ X,一次或多次   这样写的我还以为一次和多次是两回事了。。。。应该写X+ X,多次。。。
回复 使用道具 举报
0*的意思就是说0出现0次或多次(注意:这个多次也可以是一次),你用0+的话就是一次或多次,那么就是最少一次,遇到102,109不久挂了
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马