内容目录
贪婪匹配与非贪婪匹配
在使用上面的通用匹配.*的时候可能我们有时候匹配到的并不是想要的结果,我们看下面的例子:

在这里我们依然是想获取中间的数字,所以中间我们依然写的是(d+),数字两侧由于内容比较杂乱,所以两侧我们想省略来写,都写.*,最后组成^He.*(d+).*Demo$,看样子并没有什么问题,我们看下运行结果:

奇怪的事情发生了,我们只得到了 7 这个数字,这是怎么回事?
这里就涉及一个贪婪匹配与非贪婪匹配的原因了,贪婪匹配下,.*会匹配尽可能多的字符,我们的正则表达式中.*后面是 d+,也就是至少一个数字,并没有指定具体多少个数字,所以.*就尽可能匹配多的字符,所以它把 123456 也匹配了,给 d+留下一个可满足条件的数字 7,所以 d+得到的内容就只有数字 7 了。
但这样很明显会给我们的匹配带来很大的不便,有时候匹配结果会莫名其妙少了一部分内容。其实这里我们只需要使用非贪婪匹配匹配就好了,非贪婪匹配的写法是.*?,多了一个?,那么它可以达到怎样的效果?我们再用一个实例感受一下:

在这里我们只是将第一个.*改成了.*?,转变为非贪婪匹配匹配。结果如下:

很好,这下我们就可以成功获取 1234567 了。原因可想而知,贪婪匹配是尽可能匹配多的字符,非贪婪匹配就是尽可能匹配少的字符,.*?之后是 d+用来匹配数字,当.*?匹配到 Hello 后面的空白字符的时候,再往后的字符就是数字了,而 d+恰好可以匹配,那么这里.*?就不再进行匹配,交给 d+去匹配后面的数字。所以这样,.*?匹配了尽可能少的字符,d+的结果就是 1234567 了。
所以说,在做匹配的时候,字符串中间我们可以尽量使用非贪婪匹配来匹配,也就是用.*?来代替.*,以免出现匹配结果缺失的情况。
但这里注意,如果匹配的结果在字符串结尾,.*?就有可能匹配不到任何内容了,因为它会匹配尽可能少的字符,例如:


观察到.*?没有匹配到任何结果,而.*则尽量匹配多的内容,成功得到了匹配结果。
所以在这里好好体会一下贪婪匹配和非贪婪匹配的原理,对后面写正则表达式非常有帮助。
上一页 相关文章
相关文章
- 【Python】修改Windows中 pip 的缓存位置与删除 pip 缓存(1)
- 记录问题解决的连接(0)
- Python 格式化输出 —— 小数转化为百分数(0)
- 解决python中TypeError: not enough arguments for format string(0)
- ‘%s=%s’ % (k, v) for k, v in params.items(), ^ SyntaxError: Generator expression must be parent(0)
- 【Python】修改Windows中 pip 的缓存位置与删除 pip 缓存(1)
- 记录问题解决的连接(0)
- Python 格式化输出 —— 小数转化为百分数(0)
- 解决python中TypeError: not enough arguments for format string(0)
- ‘%s=%s’ % (k, v) for k, v in params.items(), ^ SyntaxError: Generator expression must be parent(0)