zoukankan      html  css  js  c++  java
  • java.util.regex包下的Pattern类和Matcher类的使用总结

    一.介绍

    Java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现
    1.Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式.

    2.Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例.Pattern类只能做一些简单的匹配操作,

       要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.

    二.Pattern类

    1.Pattern.compile(),Pattern.pattern()

    Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式,将给定的正则表达式编译到模式中.
    pattern() 返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数
        /**
         * Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,
         * 但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式,将给定的正则表达式编译到模式中,
         * pattern() 返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数
         */
        @Test
        public void test3(){
            Pattern p=Pattern.compile("\w+");
            String str = p.pattern();
            System.out.println(str);//返回 w+ 
        }

    2.Pattern.split()

    Pattern有一个split(CharSequence input)方法,用于分隔字符串,并返回一个String[],String.split(String regex)就是通过Pattern.split(CharSequence input)来实现的. 
        /**
         * Pattern有一个split(CharSequence input)方法,用于分隔字符串,并返回一个String[],
         * String.split(String regex)就是通过Pattern.split(CharSequence input)来实现的. 
         */
        @Test
        public void test4(){
            Pattern p=Pattern.compile("\d+"); 
            String[] str=p.split("我的QQ是:456456我的电话是:0532214我的邮箱是:aaa@aaa.com"); 
            for (String string : str) {
                System.out.println(string);
                /*
                打印结果:
                我的QQ是:
                我的电话是:
                我的邮箱是:aaa@aaa.com             
                 */
            }
        }

     3.Pattern.matches()

    Pattern.matches(String regex,CharSequence input)是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串.

        @Test
        public void test5(){
            System.out.println(Pattern.matches("\d+","2223"));//返回true 
            System.out.println(Pattern.matches("\d+","2223aa"));//返回false,需要匹配到所有字符串才能返回true,这里aa不能匹配到
            System.out.println(Pattern.matches("\d+","22bb23"));//返回false,需要匹配到所有字符串才能返回true,这里bb不能匹配到 
        }    


    三.Matcher类

    Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例.Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作.

    Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 

    1.Pattern.matcher()

        @Test
        public void test6(){
            Pattern p=Pattern.compile("\d+"); 
            Matcher m=p.matcher("22bb23"); 
            m.pattern();//返回p 也就是返回该Matcher对象是由哪个Pattern对象的创建的 
        }        

    2.Matcher.matches()

    Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false,matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true

        /**
         * Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false 
         * matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true 
         */
        @Test
        public void test7(){
            Pattern p=Pattern.compile("\d+"); 
            Matcher m=p.matcher("22bb23"); 
            System.out.println(  m.matches()  );//返回false,因为bb不能被d+匹配,导致整个字符串匹配未成功. 
            
            Matcher m2=p.matcher("2223"); 
            System.out.println(  m2.matches()  );//返回true,因为d+匹配到了整个字符串
        }    

    我们现在回头看一下Pattern.matches(String regex,CharSequence input),它与Pattern.compile(regex).matcher(input).matches() 等价!

    3.Matcher.lookingAt()

    lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
        /**
         * lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true 
         */
        @Test
        public void test8(){
            Pattern p=Pattern.compile("\d+"); 
            Matcher m=p.matcher("22bb23"); 
            System.out.println(  m.lookingAt()  );//返回true,因为d+匹配到了前面的22
            
            Matcher m2=p.matcher("aa2223"); 
            System.out.println(  m2.lookingAt()  );//返回false,因为d+不能匹配前面的aa         
        }

    4.Matcher.find()

    find()对字符串进行匹配,匹配到的字符串可以在任何位置.

        /**
         * find()对字符串进行匹配,匹配到的字符串可以在任何位置.
         */
        @Test
        public void test9(){
            Pattern p=Pattern.compile("\d+"); 
            Matcher m=p.matcher("22bb23"); 
            System.out.println(  m.find()  );//返回true
            
            Matcher m2=p.matcher("aa2223"); 
            System.out.println(  m2.find()  );//返回true
            
            Matcher m3=p.matcher("aa2223bb"); 
            System.out.println(  m3.find()  );//返回true
            
            Matcher m4=p.matcher("aabb"); 
            System.out.println(  m4.find()  );//返回false 
        }

    5.Matcher.start(),Matcher.end(),Matcher.group()

        @Test
        public void test10(){
            Pattern p=Pattern.compile("\d+"); 
            Matcher matcher = p.matcher("aaa2223bb"); 
            System.out.println(  matcher.find()  );//返回ture 匹配2223 
            System.out.println(  matcher.start()  );//返回3 
            System.out.println(  matcher.end()  );//返回7,返回的是2223后的索引号 
            System.out.println(  matcher.group()  ); //返回2223 
            System.out.println("=============");
            
            Matcher matcher2=p.matcher("2223bb"); 
            System.out.println(  matcher2.lookingAt()  ); //返回true 匹配2223 
            System.out.println(  matcher2.start()  );   //返回0,由于lookingAt()只能匹配前面的字符串,所以当使用lookingAt()匹配时,start()方法总是返回0 
            System.out.println(  matcher2.end()  );   //返回4 
            System.out.println(  matcher2.group()  );   //返回2223 
        }

    6.Matcher.start(i),Matcher.end(i),Matcher.group(i)

    start(),end(),group()均有一个重载方法它们是start(int i),end(int i),group(int i)专用于分组操作,Mathcer类还有一个groupCount()用于返回有多少组. 

        /**
         *说了这么多,相信大家都明白了以上几个方法的使用,该说说正则表达式的分组在java中是怎么使用的.
         *start(),end(),group()均有一个重载方法它们是start(int i),end(int i),group(int i)专用于分组操作,Mathcer类还有一个groupCount()用于返回有多少组. 
         */
         
         @Test
         public void test11(){
             Pattern p=Pattern.compile("([a-z]+)(\d+)"); 
             Matcher m=p.matcher("aaa2223bb"); 
             m.find();   //匹配aaa2223 
             m.groupCount();   //返回2,因为有2组 
             m.start(1);   //返回0 返回第一组匹配到的子字符串在字符串中的索引号 
             m.start(2);   //返回3 
             m.end(1);   //返回3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置. 
             m.end(2);   //返回7 
             m.group(1);   //返回aaa,返回第一组匹配到的子字符串 
             m.group(2);   //返回2223,返回第二组匹配到的子字符串          
         }

    四.较高级的正则匹配操作 (主要是Matcher.group() 的使用)

     1.

        /**
         * 现在我们使用一下稍微高级点的正则匹配操作,例如有一段文本,里面有很多数字,
         * 而且这些数字是分开的,我们现在要将文本中所有数字都取出来,利用java的正则操作是那么的简单.
         */
         @Test
         public void test12(){
             Pattern p=Pattern.compile("\d+"); 
             Matcher m=p.matcher("我的QQ是:456456 我的电话是:0532214 我的邮箱是:aaa123@aaa.com"); 
             while(m.find()) { 
                  System.out.println(m.group());
                  /*
                             打印输出
                   456456
                   0532214
                   123
                   */
             }      
         }

    2. 

         /**
          * 现在大家应该知道,每次执行匹配操作后start(),end(),group()三个方法的值都会改变,
          * 改变成匹配到的子字符串的信息,以及它们的重载方法,也会改变成相应的信息. 
          * 注意:只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,
          * 也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.
          */
         @Test
         public void test13(){
             Pattern p=Pattern.compile("\d+");
             Matcher m=p.matcher("我的QQ是:456456 我的电话是:0532214 我的邮箱是:aaa123@aaa.com");          
             while(m.find()) { 
                 System.out.println(m.group()); 
                 System.out.print("start:"+m.start()); 
                 System.out.println(" end:"+m.end()); 
                 /*
                                打印输出
                    456456
                    start:6 end:12
                    0532214
                    start:19 end:26
                    123
                    start:36 end:39
                  */
            } 
         }

     3.见另一篇博客http://www.cnblogs.com/DreamDrive/p/7594259.html

        @Test
        public void test1() {
            Pattern pattern = Pattern.compile("页面下载失败\.url:\[http://[a-z0-9]+\.(.+)/.+\]\.当前时间戳:\[([0-9]+)\]");
            Matcher matcher = pattern.matcher("页面下载失败.url:[http://item.jd.com/15626278.html].当前时间戳:[1471415298943]");
            if(matcher.find()){
                String top_domain = matcher.group(1);
                String curr_time = matcher.group(2);
                System.out.println(top_domain+"--"+"--"+curr_time);//jd.com----1471415298943
            }
        }
        
        @Test
        public void test2(){
            String url = "https://item.jd.com/698763154.html";
            Pattern pattern = Pattern.compile("https://item.jd.com/([0-9]+).html");
            Matcher matcher = pattern.matcher(url);
            if(matcher.find()){
                System.out.println(matcher.group(1));//698763154
                System.out.println(matcher.group(0));//https://item.jd.com/698763154.html
            }
        }
  • 相关阅读:
    维护keepalived与mysql漂移脚本
    Linux限制普通用户只能使用某命令
    Android的AlertDialog详解
    android:传感器的使用
    android:wifi
    android: 使用Canvas 绘图
    在 Eclipse 中 配置 tomcat
    android:AIDL
    android之Service 深入剖析
    广播发送者与广播接收者
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/7596963.html
Copyright © 2011-2022 走看看