黑马程序员技术交流社区

标题: 正则表达式一个小问题 [打印本页]

作者: 轻语。    时间: 2014-4-26 11:01
标题: 正则表达式一个小问题
本帖最后由 伍叶竹 于 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没被替换
作者: 水竹    时间: 2014-4-26 12:41
本帖最后由 水竹 于 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,所以就成那样啦。
作者: 轻语。    时间: 2014-4-26 13:02
水竹 发表于 2014-4-26 12:41
这个是这么一回事:
首先,如果是正确的那个,即:

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

3Q{:3_56:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2