前言
前文分析过,正则中有三种模式: 贪婪、勉强、侵占。
勉强模式其实比较好理解,就是尽量少的去匹配字符。
贪婪和侵占模式有一些相似,但又有很大的不同,下面我们就通过实例来分析一下两者的区别。
关于 贪婪、勉强、侵占 模式的对比,请点击:正则表达式中的贪婪、勉强、侵占模式到底是什么意思?
正文
我们再来回顾一下贪婪模式和侵占模式:
-
贪婪模式
是在表达式中单独使用正则量词?
、*
、+
、{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
阅读更多文章,请关注公众号: 老王学源码