Java正则表达式Pattern和Matcher原理详解

 更新时间:2020年02月25日 11:48:30   投稿:yaominghui  
这篇文章主要介绍了Java正则表达式Pattern和Matcher原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Java正则表达式Pattern和Matcher原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

基本使用

Scanner中的使用正则表达式

//Scanner 支持的分组
    Scanner cin=new Scanner("red a bbc").useDelimiter("\\s*a\\s*");
    System.out.println(cin.next());
    System.out.println(cin.next());out:
redbbc

等同于下面代码

//等于 正则
Scanner cin2=new Scanner("red a bbc");
cin2.findInLine("\\s*"); // findLine 允许存在多个,match()为最终需要匹配的字符串
MatchResult result = cin2.match();
for (int i = 0; i < result.groupCount(); i++) {
  System.out.println(result.group(i));
}

Pattern:

 //基本匹配
    boolean b = Pattern.matches("a*b", "aaaab");
    System.out.println(b);

String的aplit的实现

//按照数字分割
    Pattern p=Pattern.compile("\\d+");
    String[] str=p.split("好456456像:0532214是");
    for (int i = 0; i < str.length; i++) {
      System.out.println(str[i]);

    }

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

Java代码示例:

Pattern.matches("\\d+","2223");//返回true 
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不能匹配到 
Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,这里bb不能匹配到 Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("22bb23"); m.pattern();//返回p 也就是返回该Matcher对象是由哪个Pattern对象的创建的

重点:

matches 方法尝试将整个输入序列与该模式匹配。

lookingAt 尝试将输入序列从头开始与该模式匹配。

find 方法扫描输入序列以查找与该模式匹配的下一个子序列。

// matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true
    Pattern p=Pattern.compile("\\d+");
    Matcher m=p.matcher("22bb23");
    m.matches();//返回false,因为bb不能被\d+匹配,导致整个字符串匹配未成功.
    Matcher m2=p.matcher("2223");
    m2.matches();//返回true,因为\d+匹配到了整个字符串

    // lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
    Pattern p1=Pattern.compile("\\d+");
    Matcher m3=p1.matcher("22bb23");
    m.lookingAt();//返回true,因为\d+匹配到了前面的22
    Matcher m4=p1.matcher("aa2223");
    m2.lookingAt();//返回false,因为\d+不能匹配前面的aa

    // find()对字符串进行匹配,匹配到的字符串可以在任何位置.
    Pattern p2=Pattern.compile("\\d+");
    Matcher m5=p2.matcher("22bb23");
    m.find();//返回true
    Matcher m6=p2.matcher("aa2223");
    m2.find();//返回true
    Matcher m7=p2.matcher("aa2223bb");
    m3.find();//返回true
    Matcher m8=p2.matcher("aabb");
    m4.find();//返回false

Mathcer.start()/ Matcher.end()/ Matcher.group()

当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信息.

  • start()返回匹配到的子字符串在字符串中的索引位置.
  • end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置. 即为最后位置加一
  • group()返回匹配到的子字符串

Java代码示例:

Pattern p=Pattern.compile("\\d+"); 
Matcher m=p.matcher("aaa2223bb"); 
m.find();//匹配2223 
m.start();//返回3 
m.end();//返回7,返回的是2223后的索引号 
m.group();//返回2223 

Mathcer m2=p.matcher("2223bb"); 
m2.lookingAt();  //匹配2223 
m2.start();  //返回0,由于lookingAt()只能匹配前面的字符串,所以当使用lookingAt()匹配时,start()方法总是返回0 
m2.end();  //返回4 
m2.group();  //返回2223 

Matcher m3=p.matcher("2223"); //如果Matcher m3=p.matcher("2223bb"); 那么下面的方法出错,因为不匹配返回false
m3.matches();  //匹配整个字符串 
m3.start();  //返回0
m3.end();  //返回3,原因相信大家也清楚了,因为matches()需要匹配所有字符串 
m3.group();  //返回2223

说了这么多,相信大家都明白了以上几个方法的使用,该说说正则表达式的分组在java中是怎么使用的.

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

Java代码示例:

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,返回第二组匹配到的子字符串

验证手机号

// 验证手机号
    Pattern compile = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$");
    Matcher matcher1 = compile.matcher("15071089603");
    while(matcher1.find()){
      System.out.println(matcher1.group());
    }

/**
   * 验证手机号码
   *
   * 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147、182
   * 联通号码段:130、131、132、136、185、186、145
   * 电信号码段:133、153、180、189、177
   *
   */
 String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,1,2,5-9])|(177))\\d{8}$";

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 基于Spring整合mybatis注解扫描是否成功的问题

    基于Spring整合mybatis注解扫描是否成功的问题

    这篇文章主要介绍了Spring整合mybatis注解扫描是否成功的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • MyBatis-Plus枚举和自定义主键ID的实现步骤

    MyBatis-Plus枚举和自定义主键ID的实现步骤

    这篇文章主要给大家介绍了关于MyBatis-Plus枚举和自定义主键ID的相关资料,文中通过实例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Spring源码解析之事务传播特性

    Spring源码解析之事务传播特性

    今天带大家分析Spring源码,文中对Spring事务传播特性做了非常详细的介绍及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • SpringBoot3.x中spring.factories SPI 服务发现机制的改变问题小结

    SpringBoot3.x中spring.factories SPI 服务发现机制的改变问题小结

    spring.factories其实是SpringBoot提供的SPI机制,底层实现是基于SpringFactoriesLoader检索ClassLoader中所有jar引入的META-INF/spring.factories文件,这篇文章主要介绍了SpringBoot3.x中spring.factories SPI 服务发现机制的改变,需要的朋友可以参考下
    2023-05-05
  • 一篇文章轻松搞懂Java中的自旋锁

    一篇文章轻松搞懂Java中的自旋锁

    随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题。这篇文章主要给大家介绍了关于Java中自旋锁的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • Java Socket+多线程实现多人聊天室功能

    Java Socket+多线程实现多人聊天室功能

    这篇文章主要为大家详细介绍了Java Socket+多线程实现多人聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • springcloud集成zookeeper的方法示例

    springcloud集成zookeeper的方法示例

    这篇文章主要介绍了springcloud集成zookeeper的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Spring中的@PropertySource注解源码详解

    Spring中的@PropertySource注解源码详解

    这篇文章主要介绍了Spring中的@PropertySource注解源码详解,@PropertySource注解用于指定资源文件读取的位置,它不仅能读取properties文件,也能读取xml文件,并且通过yaml解析器,配合自定义PropertySourceFactory实现解析yaml文件,需要的朋友可以参考下
    2023-11-11
  • Java面试题-实现复杂链表的复制代码分享

    Java面试题-实现复杂链表的复制代码分享

    这篇文章主要介绍了Java面试题-实现复杂链表的复制代码分享,小编觉得还是挺不错的,具有参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java基础开发之JDBC操作数据库增删改查,分页查询实例详解

    Java基础开发之JDBC操作数据库增删改查,分页查询实例详解

    这篇文章主要介绍了Java基础开发之JDBC操作数据库增删改查,分页查询实例详解,需要的朋友可以参考下
    2020-02-02

最新评论