假定要分析的字符串是xfooxxxxxxfoo

模式.*foo (贪婪模式): 模式分为子模式p1(.*)和子模式p2(foo)两个部分. 其中p1中的量词匹配方式使用默认方式(贪婪型)。 匹配开始时,吃入所有字符xfooxxxxxx去匹配子模式p1。匹配成功,但这样以来就没有了字符串去匹配子模式p2。本轮匹配失败;第二轮:减少p1部分的匹配量,吐出最后一个字符, 把字符串分割成xfooxxxxxxfo和o两个子字符串s1和s2。 s1匹配p1, 但s2不匹配p2。本轮匹配失败;第三轮,再次减少p1部分匹配量,吐出两个字符, 字符串被分割成xfooxxxxxxfo和oo两部分。结果同上。第四轮,再次减少p1匹配量, 字符串分割成xfooxxxxxx和foo两个部分, 这次s1/s2分别和p1/p2匹配。停止尝试,返回匹配成功。
    模式.*?foo (勉强模式): 最小匹配方式。第一次尝试匹配, p1由于是0或任意次,因此被忽略,用字符串去匹配p2,失败;第二次,读入第一个字符x, 尝试和p1匹配, 匹配成功; 字符串剩余部分fooxxxxxxfoo中前三个字符和p2也是匹配的. 因此, 停止尝试, 返回匹配成功。在这种模式下,如果对剩余字符串继续去寻找和模式相匹配的子字符串,还会找到字符串末尾的另一个xfoo,而在贪婪模式下,由于第一次匹配成功的子串就已经是所有字符,因此不存在第二个匹配子串。
    模式.*+foo (侵占模式): 也叫占用模式。匹配开始时读入所有字符串, 和p1匹配成功, 但没有剩余字符串去和p2匹配。因此, 匹配失败。返回。

简单地说, 贪婪模式和占有模式相比, 贪婪模式会在只有部分匹配成功的条件下, 依次从多到少减少匹配成功部分模式的匹配数量, 将字符留给模式其他部分去匹配; 而占用模式则是占有所有能匹配成功部分, 绝不留给其他部分使用。

再看下面一个例子:贪婪模式与侵占模式的比较
正则:\w+[a-z]与\w++[a-z]
目标串:232hjdhfd7474$
分析:①\w+[a-z]:\w+属于贪婪模式,会一次性吃掉它所能吃掉的所有的字符,也就是子串232hjdhfd7474,此时[a-z]不能够找到匹配了,故\w+匹配的串会吐出一个字符4,但此时还是得不到匹配。反复的这样吐出回退,直到吐出字符d时,此时[a-z]能够匹配h,所以这时正则表达式会返回一次成功的匹配结果,为232hjdhfd
②\w++[a-z]:\w++属于侵占模式,它会一次性吃掉它所能够吃掉的所有字符,即子串232hjdhfd7474,而且不留给其他部分使用,故不会回退。此时[a-z]不能够找到匹配,所以此次匹配失败。在余下的子串中也找不到能匹配成功的子串。所以整个正则表达式是找不到匹配结果的!

量 词 种 类 意  义
贪婪 勉强 侵占
X? X?? X?+ 匹配 X 零次或一次
X* X*? X*+ 匹配 X 零次或多次
X+ X+? X++ 匹配 X 一次或多次
X{n} X{n}? X{n}+ 匹配 X n 次(这个应该不存在这几种模式,就是固定匹配n个)
X{n,} X{n,}? X{n,}+ 匹配 X 至少 n 次
X{n,m} X{n,m}? X{n,m}+ 匹配 X 至少 n 次,但不多于 m 次
如果想系统的学习正则表达式,请移步我的 正则表达式从入门到高手 的视频课程:
http://edu.51cto.com/sd/59587

转载于:https://www.cnblogs.com/kevin-yuan/archive/2012/09/02/2667428.html

正则表达式的三种模式【贪婪、勉强、侵占】的分析相关推荐

  1. 微信小程序开发的三种模式

    摘要:截止到2018年6月底,正式上线发布的微信小程序已超过100万个.而越来越多的公司也已经在做微信小程序开发,许多人会觉得"微信小程序开发是开发者们的专利".答案是否定的,今天 ...

  2. Oracle 11g dataguard三种模式以及实时查询(Real-time query)功能设置

    之前我们讨论过<Linux Oracle 11g dataguard物理standby 配置过程>, 但是在实际过程中会遇到不同的问题,首先我们讨论下ORACLE DATAGUARD的三种 ...

  3. SAP EWM 与 AGV 机器人对接的三种模式

    SAP EWM 与 AGV 机器人对接的三种模式 https://mp.weixin.qq.com/s/xGfUMSBTEMYKce5oXcWDqA 导读    本文转载自:弘毅供应链,跟随供应链专家 ...

  4. Tomcat三种模式及配置APR模式

    为什么80%的码农都做不了架构师?>>>    Tomcat三种模式 Tomcat Connector的三种不同的运行模式性能相差很大,有人测试过的结果如下: 这三种模式的不同之处如 ...

  5. 宠物乘机的三种模式【转】

    几天前微博用户@HUST_维维豆奶在网上控诉,他搭乘东航MU2544次航班(上海浦东-武汉)时,托运的金毛犬在天河机场被打成重伤(附1).机场方面给出了官方回应(附2与附3),并且已向事主支付了五万元 ...

  6. Vim编辑器的基本使用和三种模式

    Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 目前使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字 ...

  7. DELL服务器安装过程中的三种模式AHCI, ATA, RAID

    BIOS 里的 SATA setting 有 AHCI mode, ATA mode, RAID mode三种模式. AHCI vs ATA ATA(AT Attachment) 是一个很久远的标准, ...

  8. mysql binlog 权限_MySQL如何开启binlog?binlog三种模式的分析

    前提,创建表t,并插入数据,语句如下: CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `t_modified` ...

  9. oracle物理DG管理-redo数据传输,应用与三种模式

    环境http://blog.csdn.net/sunziyue/article/details/50799648基础之上 1学习配置参数 下列参数为primary 角色相关 *.db_name='or ...

最新文章

  1. jQuery中常用的函数方法总结
  2. 为什么我可以在Java中抛出null? [重复]
  3. 关于获取客户端Mac地址
  4. roobo机器人怎么唱歌_日本“观音”机器人问世,可以陪僧人念佛经
  5. C++ 多继承中的多义性
  6. Android之jni入门
  7. aix查看文件夹大小命令_轻松掌握 Linux 命令(1):ls 命令
  8. ethereum(以太坊)(二)--合约中属性和行为的访问权限
  9. Finding distance between two curves
  10. 基于matlab的数字图像处理---图像的锐化与边缘提取
  11. PCBA可靠性测试有哪些?
  12. 原生JS如何在在指定位置插入元素,前面、后面
  13. iOS 多线程dispatch_async dispatch_sync(GCD)详尽总结
  14. 经典基础教程---Programming TCP/IP Windows Sockets in C++
  15. JS变量、数据类型及运算符
  16. 从“七宗罪”角度,看互联网产品与人性的深沉纠缠
  17. python代码设计测试用例_《带你装B,带你飞》pytest成神之路2- 执行用例规则和pycharm运行的三种姿态...
  18. 二阶偏微分方程组 龙格库塔法_1、经典四阶龙格库塔法解一阶微分方程组
  19. Qt模拟键盘按键与组合键
  20. 让DedeCMS的栏目页标题显示页码数

热门文章

  1. 《A Discussion on Solving Partial Differential Equations using Neural Networks》梳理
  2. mysql 无法创建用户_mysql不能创建用户
  3. deepin安装windows虚拟机_Deepin Linux V20系统通过安装wine实现运行windows程序
  4. python简单命令语句_python基础教程之[基础学习]MySQL常用语句命令总结|python基础教程|python入门|python教程...
  5. 电子计算机简称什么也称什么,点点点电子美容仪
  6. linux空间不足 进不了系统更新,ubuntu更新时提示/boot空间不足的解决方法
  7. java.lang.IllegalStateException: Ambiguous mapping found. Cannot map ' ' bean method
  8. php定位和天气,基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用_PHP教程...
  9. php背景时间渐变,CSS3怎么实现背景颜色渐变?(图文+视频)
  10. php 图片文件转base64编码格式,php如何将图片转为base64编码格式