【笔记】正则表达式·记②--贪婪匹配、非贪婪匹配、独占模式和量词

正则表达式·记②

贪婪匹配、非贪婪匹配和独占模式

贪婪匹配

在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配,如果后面的匹配不上,会吐出已经匹配过的再去尝试

aabb 中使用正则 a* 的匹配过程:

第一次到第一个字母b发现了不满足的情况,输出aa

第二次匹配剩下的bb,发现配对不上,输出空字符串

第三次匹配剩下的b,发现也不对,输出空的字符串

第四次匹配空字符串,直接输出空的字符串

可以发现贪婪模式的特点就是尽可能进行最大长度匹配

非贪婪匹配

简单来说,非贪婪模式会尽可能短地去匹配,在元字符后面加上英文的问号(?),找出长度最小且满足要求,比如a*?,如果匹配不上,会匹配更长的字段进行尝试

对比一下

image

image

不加问号的正则是贪婪匹配,匹配上了从第一个引号到最后一个引号之间的所有内容;加了问号的正则是非贪婪匹配,找到了符合要求的结果

独占模式

贪婪模式以及非贪婪模式都需要发生回溯才能完成相应的功能,但是很多时候,我们只想匹配不上就返回失败就行,那么另外一种模式就派上了用场,独占模式

在量词元字符后加英文的加号(+),在满足要求情况下,尽可能的按最长去匹配,匹配不上就直接失败

两个例子

贪婪模式

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匹配不上

posted @ 2022-03-15 22:55  DbWong_0918  阅读(272)  评论(0编辑  收藏  举报