Javascript正则表达式可以说是Js中最重要的内容之一。它能解决很多字符串匹配的问题。比如想判断一个字符串是否为合法的邮箱地址,是否为有效的手机号等。然而,在匹配字符串时,一旦遇到贪婪和惰性这两种匹配模式,它们的饥饿程度就展现无遗了。下面,我们就来看看这两种匹配模式的区别。
贪婪模式(Greedy Quantifier)是指在匹配字符串时,会尽可能地去匹配满足条件的最长字符串,而不是找到就返回。比如,如下代码:
let str = "aaaab"; let result = str.match(/a+/g); console.log(result);它的输出结果为:['aaaa']。这是因为贪婪模式会尽可能地匹配到最长的符合匹配规则的字符串,所以结果就是它所匹配到的最长字符串。
相对地,惰性模式(Lazy Quantifier),又称为非贪婪模式,是指在匹配字符串时,会尽可能地去匹配满足条件的最短字符串,而不是找到就返回。比如,如下代码:
let str = "aaaab"; let result = str.match(/a+?/g); console.log(result);它的输出结果为:['a', 'a', 'a', 'a'],这是因为惰性模式会尽可能地匹配到最短的符合匹配规则的字符串,所以结果就是它所匹配到的最短字符串。
贪婪模式在匹配时会尽量匹配到符合模式的最长字符串,如果不是它需要的话,就不会回溯。而惰性模式则尝试利用回溯,使匹配的长度最短。下面再来看一个正则表达式中,贪婪模式与惰性模式的差异。
let str = "123"; let result1 = str.match(/456789.*/g); let result2 = str.match(/.*?/g); console.log(result1); console.log(result2);输出结果为:['123'] 和 ['456789123', '456']。由此可见,贪婪模式的输出结果是整个匹配的字符串,而惰性模式将匹配结果切成了三个部分,输出了每个匹配结果的最短字符串。在实际开发中,我们可以根据具体需求来选择使用贪婪模式还是惰性模式。如果想要匹配最长的字符串,就使用贪婪模式;如果想要匹配最短的字符串,就使用惰性模式。当然,也可以使用正则表达式元字符“?”来定义非贪婪模式。
let str = "aaaab"; let result = str.match(/a+??/g); console.log(result);它的输出结果同惰性模式:['a', 'a', 'a', 'a']。综上所述,贪婪模式和惰性模式是在匹配字符串时经常会遇到的问题。需要我们根据实际情况来选择使用哪一种模式。同时,以正则表达式元字符“?”来表示非贪婪匹配,也是我们必须掌握的知识点。