关于正则匹配机制的问题

来源:4-5 email邮箱

亚麻桑

2021-07-25 17:53:19

老师,看完本节课,有一些地方不太理解……

假设有如下正则匹配:

var str = ".cn.com.aaa.bbbb";
var pattern = /^(\.[a-z]+)*\.([a-z]{1,4})$/;
console.log(str.match(pattern));

结果是:

http://img.mukewang.com/climg/60fd300509540be906740152.jpg

有两个问题:

1、为什么捕获到【.aaa】,而不是【.cn】、【.com】、【.aaa】。因为它是最后一个匹配到的吗?

2、按照我的理解,贪婪模式下,前面的【(\.[a-z]+)*】已经能够匹配整个字符串【.cn.com.aaa.bbbb】,但是正则后面还有【\.】,显示不能这么匹配。正确的做法,只能匹配到【.cn.com.aaa】。正则采用了什么机制规避这种过度贪婪?

写回答

1回答

好帮手慕久久

2021-07-25

同学你好,解答如下:

1、从结果上分析,是因为.aaa处于最后面,所以分组中,匹配到了它。

2、正则在做贪婪匹配时,要保证“更多的匹配”,还要保证满足正则的规则。比如这里,(\.[a-z]+)*虽然能匹配到.cn.com.aaa.bbbb,但是如果这样匹配,就没法满足后面的规则  \.([a-z]{1,4})  了。所以它就不会这样匹配,而是寻找下一个可能的匹配位置,继续判断。

正则的内容,会简单应用即可。实际开发中,很少会应用特别难的正则。如果对底层原理感兴趣,可以工作后,花时间研究一下。

祝学习愉快!

1

0 学习 · 14456 问题

查看课程