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
        }
    }
复制代码

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/7596963.html,如需转载请自行联系原作者

相关文章
|
7天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
35 17
|
3天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
28 4
|
4天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
12 2
|
8天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
12天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
12天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
12天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
20 3
|
Java 索引 API
java Pattern和Matcher详解
结论:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一种最基础最简单的匹配。 java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(
1536 0
|
10天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
1天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
下一篇
无影云桌面