【笔记】正则表达式·记②--贪婪匹配、非贪婪匹配、独占模式和量词
正则表达式·记②
贪婪匹配、非贪婪匹配和独占模式
贪婪匹配
在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配,如果后面的匹配不上,会吐出已经匹配过的再去尝试
aabb 中使用正则 a* 的匹配过程:
第一次到第一个字母b发现了不满足的情况,输出aa
第二次匹配剩下的bb,发现配对不上,输出空字符串
第三次匹配剩下的b,发现也不对,输出空的字符串
第四次匹配空字符串,直接输出空的字符串
可以发现贪婪模式的特点就是尽可能进行最大长度匹配
非贪婪匹配
简单来说,非贪婪模式会尽可能短地去匹配,在元字符后面加上英文的问号(?),找出长度最小且满足要求,比如a*?,如果匹配不上,会匹配更长的字段进行尝试
对比一下
不加问号的正则是贪婪匹配,匹配上了从第一个引号到最后一个引号之间的所有内容;加了问号的正则是非贪婪匹配,找到了符合要求的结果
独占模式
贪婪模式以及非贪婪模式都需要发生回溯才能完成相应的功能,但是很多时候,我们只想匹配不上就返回失败就行,那么另外一种模式就派上了用场,独占模式
在量词元字符后加英文的加号(+),在满足要求情况下,尽可能的按最长去匹配,匹配不上就直接失败
两个例子
贪婪模式
regex = “xy{1,3}z”
text = “xyyz”
在匹配时,y{1,3}会尽可能长地去匹配,当匹配完xyy后,因为y是要尽可能的最长匹配,但字符串中后面是个z,这就会导致匹配不上,这时候正则就会向前回溯,吐出当前字符 z,接着用正则中的z去匹配
非贪婪模式
regex = “xy{1,3}?z”
text = “xyyz”
由于 y{1,3}? 代表匹配 1 到 3 个 y,非贪婪模式又是尽可能少地匹配,匹配上一个 y 之后,也就是在匹配上 text 中的 xy 后,正则会使用 z 和 text 中的 xy 后面的 y 比较,发现正则 z 和 y 不匹配,这时正则就会向前回溯,重新查看 y 匹配两个的情况,匹配上正则中的 xyy,然后再用 z 去匹配 text 中的 z
独占模式
regex = “xy{1,3}+yz”
text = “xyyz”
独占模式会尽可能多地去匹配,如果匹配失败就结束,匹配了两个y,不回溯导致正则z前面的y匹配不上