实例解析Java程序中正则表达式的贪婪模式匹配

 更新时间:2016年05月11日 17:45:39   作者:chaofanwei  
贪婪模式又叫最大匹配,X?、X*、X+、X{n,}都是最大匹配,例如你要用“<.+>”去匹配“a<tr>aava </tr>abb”,也许你所期待的结果是想匹配“<tr>”,但是实际结果却会匹配到“<tr>aava </tr>”,下面我们就来看具体看一下贪婪模式的使用.

贪婪模式(Greedy):

数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。如果你发现表达式匹配的结果与预期的不符,很有可能是因为——你以为表达式只会匹配前面几个字符,而实际上它是贪婪模式,所以会一直匹配下去。
贪婪与非贪婪,加上?为非贪婪:

var s = '1023000'.match(/(\d+)(0*)/);
s
["1023000", "1023000", ""]

var s = '1023000'.match(/^(\d+)(0*)$/);
s
["1023000", "1023000", ""]

var s = '1023000'.match(/^(\d+?)(0*)$/);
s
["1023000", "1023", "000"]

var s = '1023000'.match(/(\d+?)(0*)/);
s
["10", "1", "0"]

java 正则表达式默认用的是greedy贪婪匹配模式既是这种类型(.*)的最长匹配,如果需要最短匹配则改为(.*?)即是勉强匹配模式。
原理分析:
如果是贪婪匹配模式,正则表达式引擎会一直匹配到字符串最后,当匹配为false时,通过
回溯的方式,倒退找到倒数第一个匹配位置,返回匹配结果
如果是勉强匹配模式,正则表达式引擎会匹配到符合pattern的末尾位置那个字符,然后再往后走一步,发现匹配为false,又回溯到找到回退的最近一个匹配为true的位置,返回结果。
看代码:
例一:

  public void test51(){ 
    String str = "aaa\"bbb\"ccc\"ddd\"eee"; 
    System.out.println(str); 
    str = str.replaceAll("\"(.*)\"", "@"); 
    System.out.println(str); 
  } 

输出:

aaa"bbb"ccc"ddd"eee
aaa@eee

例二:

 @Test 
  public void test52(){ 
    String str = "aaa\"bbb\"ccc\"ddd\"eee"; 
    System.out.println(str); 
     
    str = str.replaceAll("\"(.*?)\"", "@"); 
    System.out.println(str); 
     
  } 

输出:

aaa"bbb"ccc"ddd"eee
aaa@ccc@eee

相关文章

  • Java实现顺序栈原理解析

    Java实现顺序栈原理解析

    这篇文章主要介绍了Java实现顺序栈原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java 中的控制反转(IOC)详解

    Java 中的控制反转(IOC)详解

    这篇文章主要介绍了理解Java 中的IOC控制反转,具有一定参考价值,需要的朋友可以了解下,希望能够给你带来帮助
    2021-10-10
  • Java实例化的几种方法总结

    Java实例化的几种方法总结

    这篇文章主要介绍了Java实例化的几种方法总结的相关资料,需要的朋友可以参考下
    2017-04-04
  • 在Java项目中实现CI/CD持续集成与持续部署

    在Java项目中实现CI/CD持续集成与持续部署

    这篇文章主要为大家介绍了在Java项目中实现CI/CD持续集成与持续部署详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 一文秒懂idea的git插件跟翻译插件

    一文秒懂idea的git插件跟翻译插件

    idea之类的开发软件真的超级多的插件,今天给大家分享idea的git插件跟翻译插件,感兴趣的朋友跟随小编一起看看吧
    2021-04-04
  • Java中的OkHttp使用教程

    Java中的OkHttp使用教程

    OkHttp是目前非常火的网络库,OKHttp与HttpClient类似,也是一个Http客户端,提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能,本文重点给大家介绍Java OkHttp使用,感兴趣的朋友一起看看吧
    2022-04-04
  • 使用java打印心型、圆形图案的实现代码

    使用java打印心型、圆形图案的实现代码

    这篇文章主要介绍了使用java打印心型、圆形图案的实现代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • java事务的概念浅析

    java事务的概念浅析

    在本篇内容里小编给大家整理的是一篇关于java事务的概念浅析,有兴趣的朋友们可以参考学习下。
    2020-12-12
  • 保证缓存和数据库的数据一致性详解

    保证缓存和数据库的数据一致性详解

    在实际开发过程中,缓存的使用频率是非常高的,只要使用缓存和数据库存储,就难免会出现双写时数据一致性的问题,本文主要介绍了如何保证缓存和数据库的数据一致性,需要的小伙伴可以参考阅读
    2023-04-04
  • SpringBoot EasyPoi动态导入导出的两种方式实现方法详解

    SpringBoot EasyPoi动态导入导出的两种方式实现方法详解

    项目里使用的是EasyPoi来处理导入导出功能的。近日因业务需求调整,一些导出功能的导出列需要根据不同的条件动态导出
    2022-09-09

最新评论