0
点赞
收藏
分享

微信扫一扫

#yyds干货盘点# 正则表达式中的勉强和侵占模式的对比分析

代码敲到深夜 2022-02-12 阅读 136

前言

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

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

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

正文

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

  • 贪婪模式
    是在表达式中单独使用正则量词 ?*+{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

举报

相关推荐

0 条评论