• 贪婪和非贪婪


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

    前面我们讲过重复限定符,其实这些限定符就是贪婪量词,比如表达式: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

  • 相关阅读:
    前端3
    前端-1
    第三十七章 MYSQL(二)
    第三十六章 MYSQL语句(一)
    第三十五 MYSQL 语句
    数字转换成中文大小写、金额大小写
    NPOI随笔——图片在单元格等比缩放且居中显示
    NPOI随笔——单元格样式CellStyle问题
    C++、C#、VB各语言日志代码
    .NET认识与理论总结
  • 原文地址:https://www.cnblogs.com/zhangj-ymm/p/9823379.html
Copyright © 2020-2023  润新知