ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何理解正则表达式的贪婪和惰性匹配原则?

如何理解正则表达式的贪婪和惰性匹配原则?

作者:绿色风 分类: 时间:2022-08-17 浏览:120
楼主
水星钓鱼
Q:如何理解正则表达式的贪婪和惰性匹配原则?
A:贪婪匹配(greedy):它会匹配尽可能多的字符。它首先看整个字符串,如果不匹配,对字符串进行收缩;遇到可能匹配的文本,停止收缩,对文本进行扩展,当发现匹配的文本时,它不着急将该匹配保存到匹配集合中,而是对文本继续扩展,直到无法继续匹配 或者 扩展完整个字符串,然后将前面最后一个符合匹配的文本(也是最长的)保存起来到匹配集合中。所以说它是贪婪的。

惰性匹配(lazy):它会匹配尽可能少的字符,它从第一个字符开始找起,一旦符合条件,立刻保存到匹配集合中,然后继续进行查找。所以说它是懒惰的。

举例如下:
对于字符串"a12345b",用 "\d+"模式(匹配一个或者多个数字)来进行查找匹配时,它是贪婪匹配。
从a字符开始,到1就开始有符合匹配的数字,它不着急将该匹配保存到匹配集合中,而是继续扩展字符直到结束。最后只找到一个符合匹配的文本为“12345“,在(匹配一个或者多个数字)它选择了匹配多个数字。

而用"\d+?"模式进行查找匹配时,它是惰性匹配。
从a字符开始,到1就开始有符合匹配的数字,保存,到2,也保存,到最后,就找到5个符合匹配的文本为“1”,“2”,“3”,“4”,“5”,在(匹配一个或者多个数字)它选择了只匹配一个数字。
验证代码如下:
  1. Sub Reg()
  2.     Dim oReg As Object
  3.     Dim oMatches As Object
  4.     Dim oMatch As Object
  5.     Set oReg = CreateObject("vbscript.regexp")
  6.     With oReg
  7.         .Global = True
  8.         .Pattern = "\d+?"
  9.         Set oMatches = .Execute("12345")
  10.         For Each oMatch In oMatches
  11.             MsgBox oMatch
  12.         Next
  13.     End With
  14. End Sub


附上贪婪和惰性匹配的转换表

 
2楼
無心
来学习一下,
3楼
bluexuemei
学习!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap