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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 轻语。 高级黑马   /  2014-4-26 11:01  /  1059 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 伍叶竹 于 2014-4-26 13:21 编辑
  1. class  RegexDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                

  6.                 String str1 = "erkktyqqquizzzzzo";//
  7.                 replaceAllDemo(str1,"(.+)\\1+","$1");

  8.                
  9.         }

  10.         public static void replaceAllDemo(String str,String reg,String newStr)
  11.         {
  12.                 str = str.replaceAll(reg,newStr);

  13.                 System.out.println(str);
  14.         }
  15.         
  16. }        
复制代码
"(.+)\\1+" 和  "(.)\\1+"  是怎么区别?老师讲的是后一个。打印结果是多个字母的被单个替换。可是改成"(.+)\\1+",最后的zzz没被替换

4 个回复

倒序浏览
本帖最后由 水竹 于 2014-4-26 13:23 编辑

这个是这么一回事:
首先,如果是正确的那个,即:
  1. str = str.replaceAll("(.)\\1+",$1);
复制代码

这样的话匹配到那一串z的时候可以置换为:
  1. str = str.replaceAll("(z)+","(z)");                         // 这句写的有问题,只是示意
复制代码

也就是说\1空间里捕获的是括号里的“.”,也就是单个z字母,所以后面$1引用的就是一个z字母;
你那个错的是这样:
  1. str = str.replaceAll("(.+)\\1+",$1);
复制代码

这时候\1捕获的变成了“z+”了,匹配到那一串z的时候就变成了这样:
  1. str = str.replaceAll("(z+)+","(z+)");                           // 这句写的有问题,只是示意
复制代码

你一共有五个连着的z,显然\1捕获的是最长的情况,也就是两个连着的z,所以就成那样啦。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 很给力!

查看全部评分

回复 使用道具 举报
水竹 发表于 2014-4-26 12:41
这个是这么一回事:
首先,如果是正确的那个,即:

大概知道了。 可是z的匹配情况不是很懂。
用"(.+)\\1+"  的时候。 三个z 结果是替换成了1个
4个是2个  5个是3个  6个是3个    7个是4个。。。
具体怎么匹配呢
回复 使用道具 举报
看结果就能看得出来,匹配的是最长的那个串啊,比如说7个z的话,能分成zzz,zzz,z,前两个分别有三个z,是能匹配成功的最长的串,所以\1空间里面就存的是三个zzz,再加上最后剩下的那一个,变成四个了。
再或者是八个,就分成zzzz,zzzz,匹配成四个,反正总之是匹配成最长的那种情况。
回复 使用道具 举报
水竹 发表于 2014-4-26 13:12
看结果就能看得出来,匹配的是最长的那个串啊,比如说7个z的话,能分成zzz,zzz,z,前两个分别有三个z,是 ...

3Q{:3_56:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马