正则表达式的贪婪与非贪婪的例子浅析

正则表达式种常用的量词X+(1个或多个)、X*(0个或1多个)、X?(0个或1个)

正则表达式默认为贪婪模式,量词要匹配使整个匹配成功的最大可能的重复次数。非贪婪匹配也就是使匹配最小的重复次数。


贪婪匹配的过程根据正则表达式的复杂程度有可能产生回溯

示例

正则表达式的贪婪与非贪婪的例子浅析_第1张图片
默认为贪婪模式


此python代码的打印结果为:bb(不清楚贪婪匹配的过程就可能想不明白)

1. .* 为贪婪模式,匹配尽可能多的字符,所以直接匹配到了字符串末尾。

2. 剩余的正则表达式仍需要匹配,从末尾开始回溯。找到倒数第一个b以后,继续向后匹配 .* 。

3. .* 后面的b无法匹配,又产生回溯,找到倒数第一个b,之前的b向前移,仍保持之前匹配的最大数量。

4. 最后的 . * 匹配字符串到末尾。

验证:

正则表达式的贪婪与非贪婪的例子浅析_第2张图片
bb后面的字符:y
正则表达式的贪婪与非贪婪的例子浅析_第3张图片
+要求至少匹配一个字符

输出为:bbb

非贪婪匹配:使用?量词将匹配转为非贪婪匹配。即从字符串的起始处开始,从左至右,依次匹配正则表达式里的字符,满足当前匹配的部部分则中止。

例:


正则表达式的贪婪与非贪婪的例子浅析_第4张图片
加入一个?量词

输出为: booooobaaaobbbb。

?.*转换为非贪婪模式,用最小的重复次数来进行匹配,匹配结果为空字符,往后匹配贪婪的b.*b,得到最大长度的开头与结尾的字符串。


正则表达式的贪婪与非贪婪的例子浅析_第5张图片
将提取部分转换为非贪婪模式

输出结果为: booooob。

提取部分得到字符串从左至右最先满足条件的子字符串(最小次数的匹配)。

你可能感兴趣的:(正则表达式的贪婪与非贪婪的例子浅析)