重复类量词都具有贪婪性,在条件允许的前提下,会匹配尽可能多的字符。
- ?、{n}和{n, m}重复类具有弱贪婪性,表现为贪婪的有限性。
- *、+和{n, }重复类具有强贪婪性,表现为贪婪的无限性。
【示例1】越是排在左侧的重复类量词匹配优先级越高。下面示例显示当多个重复类量词同时满足条件时,会在保证右侧重复类量词最低匹配次数基础上,最左侧的重复类量词将尽可能占有所有字符。
var s ="<html><head><title></title></head><body></body></html>"; var r = /(<.*>)(<.*>)/ var a = s.match(r);
//左侧子表达式匹配"<html><head><title></title></head><body></body>"
console.log(a[1]); console.log(a[2]); //右侧子表达式匹配"</html>"
与贪婪匹配相反,惰性匹配将遵循另一种算法:在满足条件的前提下,尽可能少的匹配字符。定义惰性匹配的方法:在重复类量词后面添加问号(?)限制词。贪婪匹配体现了最大化匹配原则,惰性匹配则体现最小化匹配原则。
【示例2】下面示例演示了如何定义惰性匹配模式。
var s ="<html><head><title></title></head><body></body></html>"; var r = /<.*?>/ var a = s.match(r); //返回单个元素数组["<html>"]
在上面示例中,对于正则表达式/<.*?>/来说,它可以返回匹配字符串"<>",但是为了能够确保匹配条件成立,在执行中还是匹配了带有4个字符的字符串"html"。惰性取值不能够以违反模式限定的条件而返回,除非没有找到符合条件的字符串,否则必须满足它。
【提示】
针对6种重复类的惰性匹配简单描述如下。
- {n, m}?:尽量匹配n次,但是为了满足限定条件也可能最多重复m次。
- {n}? :尽量匹配n次。
- {n, }?:尽量匹配n次,但是为了满足限定条件也可能匹配任意次。
- ?? :尽量匹配,但是为了满足限定条件也可能最多匹配1次,相当于{0, 1}?。
- +?:尽量匹配1次,但是为了满足限定条件也可能匹配任意次,相当于{1, }?。
- *?:尽量不匹配,但是为了满足限定条件也可能匹配任意次,相当于{0, }?。