Java正则之贪婪匹配、惰性匹配

作者:hebedich 时间:2022-08-14 16:41:23 

贪婪量词:

先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么    再次去掉最后一个字符串,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。简单量词都是贪婪量词。

惰性量词:

先看字符串中的第一个字母是不是一个匹配,如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。惰性量词和贪婪量词的工作方式恰好相反。

支配量词:

只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。

    贪婪量词   惰性量词    支配量词                      描述
    -------------------------------------------------------------------------------------
      ?             ??             ?+                      可以出现0次或1次,但至多出现1次
      *             *?            *+                      可以出现任意次,也可以不出现
      +             +?            ++                      出现1次或多次,但至少出现1次
      {n}        {n}?           {n}+                   一定出现n次
      {n,m}    {n,m}?       {n,m}+               至少出现n次,但至多不能超过m次
      {n,}       {n,}?          {n,}+                 可以出现任意次,但至少出现n次
    例如:我们要从字符串abbbaabbbaaabbb1234中获得abbb,aabbb,aaabbb的匹配

    1、贪婪量词


       var regexp = /.*bbb/g;
        var a = str.match(regexp);
        alert(a.length);   //output:1
        alert(a[0]);       //output:abbbaabbbaaabbb

    贪婪量词的工作过程可以这样表示:
      a)abbbaabbbaaabbb1234
      b)abbbaabbbaaabbb123
      c)abbbaabbbaaabbb12
      d)abbbaabbbaaabbb1
      e)abbbaabbbaaabbb //true
    可以看到,贪婪量词在取得一次匹配后就会停止工作,虽然我们加了'g'(全局匹配)

    2、惰性量词


        var regexp = /.*?bbb/g;
        var a = str.match(regexp);
        alert(a.length);   //output:3
        alert(a[0]);       //output:abbb
        alert(a[1]);       //output:aabbb
        alert(a[2]);       //output:aaabbb

    惰性量词的工作过程可以这样表示:
      a)a
      b)ab
      c)abb
      d)abbb //保存结果,并从下一个位置重新开始
 
      e)a
      f)aa
      g)aab
      h)aabb
      j)aabbb //保存结果,并从下一个位置重新开始
 
      e)a
      e)aa
      e)aaa
      e)aaab
      e)aaabb
      e)aaabbb  //保存结果,并从下一个位置重新开始
    由于JS是不支持支配量词的,所以支配量词我们只能用JAVA来演示:


        String string = "abbbaabbbaaabbb1234";
        Pattern p = Pattern.compile(".*+bbb");
        Matcher m = p.matcher(string);
        System.out.println(m.find());   //output:false

    因为支配量词采用一刀切的匹配方式,如:
    a)abbbaabbbaaabbb1234 //false

以上所述就是本文的全部内容了,希望大家能够喜欢,能够对大家熟练掌握java正则匹配有所帮助。

请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!

标签:Java,正则,贪婪匹配,惰性匹配
0
投稿

猜你喜欢

  • 详解Kotlin的空指针处理

    2022-06-03 06:57:58
  • 解决JavaWeb读取本地json文件以及乱码的问题

    2023-09-14 18:35:14
  • 解决idea删除模块后重新创建显示该模块已经被注册的问题

    2023-04-24 18:06:12
  • List集合对象中按照不同属性大小排序的实例

    2023-06-07 14:27:41
  • response文件流输出文件名中文不显示的解决

    2023-02-06 19:41:02
  • Mybatis利用OGNL表达式处理动态sql的方法教程

    2022-11-26 22:22:02
  • web打印 window.print()介绍

    2022-10-22 23:50:59
  • Java实现导出ZIP压缩包的方法

    2023-05-06 04:58:57
  • Spring Boot中如何使用断路器详解

    2022-03-03 06:34:49
  • Android实现拍照、录像、录音代码范例

    2021-08-16 09:31:40
  • Winform实现将网页生成图片的方法

    2022-09-06 13:39:31
  • java中断线程的正确姿势完整示例

    2023-01-27 06:33:58
  • IntelliJ IDEA 2017 汉化包及图文教程

    2023-11-25 12:17:58
  • java面向对象设计原则之里氏替换原则示例详解

    2023-02-02 05:04:41
  • java自定义序列化的具体使用

    2022-02-06 06:27:12
  • Android studio实现简易计算器App功能

    2023-03-07 07:57:57
  • Java调用groovy脚本的方式分享

    2022-09-25 09:20:24
  • Android WebView无法弹出软键盘的原因及解决办法

    2023-07-07 18:30:00
  • mybatis-plus update更新操作的三种方式(小结)

    2023-10-08 14:05:08
  • Java中LocalDateTime的具体用法

    2023-11-23 14:00:05
  • asp之家 软件编程 m.aspxhome.com