正则表达式中的勉强和侵占模式的对比分析

前言

前文分析过,正则中有三种模式: 贪婪、勉强、侵占。
勉强模式其实比较好理解,就是尽量少的去匹配字符。

贪婪和侵占模式有一些相似,但又有很大的不同,下面我们就通过实例来分析一下两者的区别。

关于 贪婪、勉强、侵占 模式的对比,请点击:正则表达式中的贪婪、勉强、侵占模式到底是什么意思?

正文

我们再来回顾一下贪婪模式和侵占模式:

  • 贪婪模式
    是在表达式中单独使用正则量词 ?*+{n,m} 的情况。
    它的特点是一次尽量多的匹配字符,但可以回退。

  • 侵占模式
    也叫占用模式,是在贪婪模式字符的后面添加一个 + 来表示的。
    它的特点是一次尽量多的匹配字符,但不可以回退。

可以看出,它们的区别在于贪婪模式是可以回退,吐出字符的;而侵占模式一次性完成最大匹配之后,是不会回吐字符的

实例分析

待匹配的目标串232hjdhfd7474$

贪婪模式的正则: \w+[a-z]

我们将上面的正则拆分成 \w+[a-z] 两个子表达式来看,\w+ 称作 p1,[a-z] 称作 p2。

p1 属于贪婪模式,会一次性吃掉它所能吃掉的所有的字符,也就是子串 232hjdhfd7474;这样的话,就只剩下 $ 与 p2 进行匹配了,显然是匹配失败的。
所以,第二轮尝试匹配时,p1 会吐出一个字符4,但此时 p2 还是得不到匹配。
反复的这样吐出回退,直到吐出字符d时,d 能与 p2 完成匹配,这时正则表达式会返回一次成功匹配的结果,即字符串 232hjdhfd

侵占模式的正则: \w++[a-z]

我们将上面的正则拆分成 \w++[a-z] 两个子表达式来看,\w++ 称作 p1,[a-z] 称作 p2。

p1 属于侵占模式,它会一次性吃掉它所能够吃掉的所有字符,即子串 232hjdhfd7474,而且 p1 不会回退字符;这时,只剩下 $ 与 p2 进行匹配了,显然是匹配失败的,所以整个表达式匹配失败。

小结

贪婪模式和侵占模式在第一次尝试匹配时,都会一次性吞下它能匹配的最长字符串,这是他们相似的地方。
贪婪模式和侵占模式最大的不同是: 贪婪模式会回吞字符,而侵占模式不会回吐字符。

更加系统的学习正则表达式的知识,请点击视频讲解:
正则表达式从入门到高手: https://edu.51cto.com/sd/59587


阅读更多文章,请关注公众号: 老王学源码
gzh_b2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老王学源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值