zoukankan      html  css  js  c++  java
  • 贪婪和非贪婪

    • 贪婪匹配:当正则表达式中包含能接受到重复的限定符时,通常的行为是匹配尽可能多的字符,这中匹配方式叫做贪婪匹配。特征是一次性读入整个字符串经行匹配,每当不匹配就舍弃最右边一个字符,继续匹配,依次匹配和舍弃,直到匹配成功或者把整个字符串舍弃为止,因此它是一种最大化数据返回,能多不会少。

    前面我们讲过重复限定符,其实这些限定符就是贪婪量词,比如表达式:d{3,6}

    用来匹配3到6位数字,在这种情况下,它是一种贪婪模式匹配,也就是假如字符串里有6个数字匹配,那它就会全部匹配到。

    String test = "61762828 176 2991 871";
        String reg = "\d{3,6}";
        Pattern pattern = Pattern.compile(reg);
        Matcher mc = pattern.matcher(test);
        while (mc.find()) {
            System.out.println("匹配结果:" + mc.group());
        }
        // 匹配结果:617628
        // 匹配结果:176
        // 匹配结果:2991
        // 匹配结果:871

    由结果可见:本来字符串中的“61762828”这一段,其实只需要出现“617”就已经匹配成功了,但它并不满足,而是匹配到了最大能匹配的字符,也就是6个。

    那么有人会问,如果多个贪婪量词凑在一起,那他们是如何支配自己的匹配权的呢?

    是这样的,多个贪婪在一起时,如果字符串能满足他们各自最大程度的匹配时,就互不干扰,但如果不能满足时,会根据深度优先的原则,也就是从左到右的每一个贪婪量词,优先最大数量的满足,剩余再分配下一个量词匹配。

    String test = "61762828 176 2991 87321";
        String reg = "(\d{1,2})(\d{3,4})";
        Pattern pattern = Pattern.compile(reg);
        Matcher mc = pattern.matcher(test);
        while (mc.find()) {
            System.out.println("匹配结果:" + mc.group());
        }
        // 匹配结果:617628
        // 匹配结果:2991
        // 匹配结果:87321

    “617628” 是前面的d{1,2}匹配出了61,后面的匹配出了7628

    "2991" 是前面的d{1,2}匹配出了29 ,后面的匹配出了91

    "87321"是前面的d{1,2}匹配出了87,后面的匹配出了321

    • 懒惰(非贪婪)

    懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能少的字符,这种匹配方式叫做懒惰匹配。特性:从左到右,从字符串的最左边开始匹配,每次试图不读入字符匹配,匹配成功,则完成匹配,否则读入一个字符再匹配,依次循环(读入字符,匹配)直到匹配成功或者把字符串的字符匹配完为止。

    代码 说明
    *? 重复任意次,但尽可能少重复
    +? 重复1次或更多次,但尽可能少重复
    ?? 重复0次或1次,但尽可能少重复
    {n,m}? 重复n到m次,但尽可能少重复
    {n,}? 重复n次以上,但尽可能少重复
    String reg = "(\d{1,2}?)(\d{3,4})";
        String test = "61762828 176 2991 87321";
        System.out.println("文本:" + test);
        System.out.println("贪婪模式:" + reg);
        Pattern p1 = Pattern.compile(reg);
        Matcher m1 = p1.matcher(test);
        while (m1.find()) {
            System.out.println("匹配结果:" + m1.group(0));
        }
        // 文本:61762828 176 2991 87321
        // 贪婪模式:(d{1,2}?)(d{3,4})
        // 匹配结果:61762
        // 匹配结果:2991
        // 匹配结果:87321

     “61762” 是左边的懒惰匹配出6,右边的贪婪匹配出1762
    "2991"  是左边的懒惰匹配出2,右边的贪婪匹配出991
    "87321" 左边的懒惰匹配出8,右边的贪婪匹配出7321

  • 相关阅读:
    字符串导出xml文件并弹出下载对话框
    Resource interpreted as Document but transferred with MIME type application/json
    org.w3c.dom document 和xml 字符串 互转
    Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException
    plsql developer中如何设置sql window显示行号
    Oracle表数据转换为XML格式数据
    Java用于取得当前日期相对应的月初,月末,季初,季末,年初,年末时间
    JS 中Json常用操作
    详解html中的marquee属性
    .net core 3.0中的Json API
  • 原文地址:https://www.cnblogs.com/zhangj-ymm/p/9823379.html
Copyright © 2011-2022 走看看