Chapter 3 正则表达式的贪婪与懒惰

1 概述

量词默认情况下是贪婪的。所谓贪婪的量词会首先匹配整个字符串,如果失败则回退一个字符后重新尝试,这个过程叫回溯。就这样不停的回溯直到找到匹配或者没有字符可尝试位置。形象的说,贪婪的量词首先一次性吃饱,然后一点点吐出来。

懒惰的量词则是采用另外一种策略。它首先从目标的起始位置开始尝试匹配,每次添加一个字符直到找到一个匹配或者尝试了整个字符串为止。形象的说,懒惰的量词是一次吃一点直到吃饱。

2 *、+和?

Kleene星号*:表示匹配的文本连续出现零次或多次,这一命名是为了纪念正则表达式的发明人Stephen Kleene。那么,".*"将匹配任何字符任意次数。

+:匹配文本一次或多次。

?:匹配文本零次或一次

默认情况下的量词是贪婪式的,那么当有一个要匹配的一行文本:"sdfsdf99999999",对于三个正则表达式:9*,9+,9?,匹配结果都是相同的,如下图所示:

不过要注意的是,对于前面两个表达式都是值匹配了一次,而第三个表达式则是连续匹配了6次,因为它每次最多匹配一次。

3 懒惰式匹配

贪婪式匹配的代价较大,而且有时候匹配的结果并不是我们期望的。比如,有一段html文本如下图所示,我们想匹配p1标签中的内容,如果使用正则表达式:<p1>.*</p1>的话,匹配的结果完全不是我们想要的,如下图所示:

这个时候就需要使用懒惰式的匹配了,很简单,只需要加上一个"?"即可,例如将以上的正则表达式改为:<p1>.*?</p1>,就可以匹配到每个p1标签中的内容,如下图所示:

那么,对于上面的例子,用表达式:9??匹配"sdfsdf99999999",将不会有任何匹配结果,因为它会懒惰式的匹配字符'9'零次,如下图所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值