我写了如下的代码String strDateText = "sdfgnhfdnjh2013年7月01日sdgldfjhggkfp";
String regex = "[(\\d{4}年\\d{1,2}月)|(\\d{4}年\\d{1,2}月\\d{1,2}日)]";
        Matcher m = Pattern.compile(regex).matcher(strDateText );
        while(m.find()){
         String t = m.group();
         System.out.println("t:" + t);
         fdatDate = t.replaceAll("年|月|日", "/");
        }为什么执行的结果是t:2
t:0
t:1
t:3
t:年
t:7
t:月
t:0
t:1
t:日我想要的结果是:
t:2013年7月1日
正则表达式Java

解决方案 »

  1.   

    首先表达式改成String regex = "\\d{4}年\\d{1,2}月(\\d{1,2}日)?";
    然后解释一下为什么你的错误
    因为你使用了多选组[],在[]里的大部分元字符都是无效的,意思是(,*,?,|,{,}等这样的字符不再是元字符,而就匹配一个(,*,?,|,{,}。
    你的正则表达式就是匹配一下字符、
    数字 { } 4 1 2 逗号 年 月 日 ( ) |
      

  2.   

    String strDateText = "sdfgnhfdnjh2013年7月01日sdgldfjhggkfp";
    String regex = "[(\\d{4}年\\d{1,2}月)|(\\d{4}年\\d{1,2}月\\d{1,2}日)]";
            Matcher m = Pattern.compile(regex).matcher(strDateText );
            StringBuffer str = new StringBuffer();
            while(m.find()){
                String t = m.group();
                System.out.println("t:" + t);
                str.append(t);
               fdatDate = t.replaceAll("年|月|日", "/");
            }
            System.out.println("t"+str);
      

  3.   

    String strDateText = "sdfgnhfdnjh2013年7月01日sdgldfjhggkfp";
    String regex = "[(\\d{4}年\\d{1,2}月)|(\\d{4}年\\d{1,2}月\\d{1,2}日)]";
            Matcher m = Pattern.compile(regex).matcher(strDateText );
            StringBuffer str = new StringBuffer();
            String fdatDate ;
            while(m.find()){
                String t = m.group();
                System.out.println("t:" + t);
                str.append(t);
               fdatDate = t.replaceAll("年|月|日", "/");
            }
            System.out.println(str);
            System.out.println(str.toString().replaceAll("年|月|日", "/").substring(0,str.length()-1));
      

  4.   

    顶1L~
    俺也偷懒改写了个简单点的:        String strDateText = "sdfgnhfdnjh2013年7月01日sdgldfjhggkfp";
            String strDateText2 = "sdfgnhfdnjh2013年7月sdgldfjhggkfp";        String regex = "((\\d{4}年\\d{1,2}月\\d{1,2}日)|(\\d{4}年\\d{1,2}月))";
            Pattern p = Pattern.compile(regex);        Matcher m = p.matcher(strDateText );
            if(m.find())
            {
                System.out.println(m.group(1));
            }
            
            m = p.matcher(strDateText2);
            if(m.find())
            {
                System.out.println(m.group(1));
            }中括号改成小括号,里面的两个小括号顺序换了下,长的放前面。