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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© David.L 中级黑马   /  2014-8-22 10:35  /  4020 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
在做小练习时,能写出了标准答案:方法一
然后还考虑测试下获取的方法:于是写了方法二,只是自己做下测试
结果发现了问题

方法二中,不论
     reg="(.)\\1+";
    reg="(.)\\1+{0,2}";
    reg="\\b(.)\\1+\\b"; 
都是输出0,也就是m.find()为false,未找到匹配

为什么呢?



  1. /*

  2.        
  3. */

  4. import java.util.regex.*;
  5. class RegexTest
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 test_1();
  10.         }
  11.         /*
  12.         需求:
  13.         将下列字符串转成:我要编程。
  14.        
  15.         到底用四种功能中哪一个?或者哪几个?
  16.         思路:
  17.         1,如果只想知道该字符对错,使用匹配。
  18.         2,想要将已有的字符串变成另一个字符串,替换。
  19.         3,想要按照自定的方式将字符串变成多个字符串,切割。获取规则以外的子串。
  20.         4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
  21.         */
  22.        
  23.         public static void test_1()
  24.         {
  25.                 String str="我我...我我...我要..要要...学学学...学学...编编编...编程...程.程程程...程...程";
  26.                 /*方法一,标准方法
  27.                 将已有字符串变成另一个字符串。使用替换功能。
  28.                 1,可以先将.去掉。
  29.                 2,再将多个重复的内容变成单个内容。
  30.                 */
  31.                 /*
  32.                 String reg="\\.+";
  33.                 str=str.replaceAll(reg,"");  //两句可以简化成一句
  34.                 reg="(.)\\1+";
  35.                 str=str.replaceAll(reg,"$1");
  36.                 sop(str);
  37.                 */
  38.                
  39.                 //方法二
  40.                 String reg="(.)\\1+{0,2}";
  41.                 Pattern p=Pattern.compile(str);
  42.                 Matcher m=p.matcher(reg);
  43.                 sop("0");
  44.                 while(m.find())
  45.                 {
  46.                         sop("1");
  47.                         String s=m.group();
  48.                         sop(s);
  49.                         sop("2");
  50.                         if(s.equals("\\."))
  51.                         {
  52.                                 sop("3");
  53.                                 continue;
  54.                         }
  55.                         sop(s);
  56.                 }
  57.         }
  58.                
  59.         public static void sop(Object obj)
  60.         {
  61.                 System.out.println(obj);
  62.         }
  63. }

复制代码


最佳答案

查看完整内容

我发现你的格式写错了!仔细看下API。 ①Pattern p =Pattern.compile(reg); ②Matchr m = p.matcher(str);

点评

额。。。最简单的笔误。。。。看了半天没看出来。。。就说我表达式没错,。。。晕死了 谢谢~  发表于 2014-8-22 12:18

10 个回复

倒序浏览
我发现你的格式写错了!仔细看下API。
①Pattern p =Pattern.compile(reg);
②Matchr m = p.matcher(str);
回复 使用道具 举报
我是过来收藏你的帖子的:)我也遇到同样问题了
回复 使用道具 举报
来看一下题
回复 使用道具 举报
本帖最后由 思维 于 2014-8-22 11:51 编辑

我再给你发一段代码,看我的结果你就应该知道了,你的方法二的匹配是对字符串的整体进行匹配,而不是局部分别匹配,所以当你匹配到“我”都后面的“.”时,就不再和“我”重复了,所以返回false。
  1. import java.util.regex.*;
  2. class Test{
  3.         public static void main(String[] args){
  4.                 String str="我我我要要要学学学编编编程程程";
  5.                 String str1="aaaabbbbccccdddd";
  6.                 String str2="aaaaaaaaaaaaaaaaa";
  7.                 String reg="(.)\\1+";

  8.                 System.out.println(str.matches(reg));
  9.                 System.out.println(str1.matches(reg));
  10.                 System.out.println(str2.matches(reg));

  11.                 String strReplace=str.replaceAll("(.)\\1+","$1");
  12.                 System.out.println(strReplace);
  13.                 String str1Replace=str1.replaceAll("(.)\\1+","$1");
  14.                 System.out.println(str1Replace);
  15.                 /*结果:false false  true
  16.                                 我要学编程 abcd
  17.                 */
  18.         }
  19. }
复制代码

回复 使用道具 举报
思维 发表于 2014-8-22 11:40
我再给你发一段代码,看我的结果你就应该知道了,你的方法二的匹配是对字符串的整体进行匹配,而不是局部分 ...

匹配的我了解,呵呵
你前面说对了
最简单的笔误
。。。。自己看了半天没看出来
。。。就说我表达式没错,。。。晕死了 谢谢~  
回复 使用道具 举报
额,哈哈哈
回复 使用道具 举报
是这样的~~,二楼正解
回复 使用道具 举报
看看。。。
回复 使用道具 举报
来看看!!!!!!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马