贪婪,懒惰模式
重复匹配
在正则表达式语法中,定义了一组重复类量词,如表所示。它们定义了重复匹配字符的确数或约数。
重复类量词列表
量词 描述
n+ 匹配任何包含至少一个 n 的字符串
n* 匹配任何包含零个或多个 n 的字符串
n? 匹配任何包含零个或一个 n 的字符串
n{x} 匹配包含 x 个 n 的序列的字符串
n{x,y} 匹配包含最少 x 个、最多 y 个 n 的序列的字符串
n{x,} 匹配包含至少 x 个 n 的序列的字符串
重复类量词都具有贪婪性,在条件允许的前提下,会匹配尽可能多的字符(尽可能的往右匹配就是贪婪性匹配)。
?、{n} 和 {n,m} 重复类具有弱贪婪性,表现为贪婪的有限性。
*、+ 和 {n,} 重复类具有强贪婪性,表现为贪婪的无限性。
与贪婪匹配相反,惰性匹配将遵循另一种算法:在满足条件的前提下,尽可能少的匹配字符。定义惰性匹配的方法:在重复类量词后面添加问号?限制词。贪婪匹配体现了最大化匹配原则,惰性匹配则体现最小化匹配原则。
针对 6 种重复类惰性匹配的简单描述如下:
{n,m}?:尽量匹配 n 次,但是为了满足限定条件也可能最多重复 m 次。
{n}? : 尽量匹配 n 次。
{n,}? : 尽量匹配 n 次,但是为了满足限定条件也可能匹配任意次。
?? : 尽量匹配,但是为了满足限定条件也可能最多匹配 1 次,相当于 {0,1}?。
+? : 尽量匹配 1 次,但是为了满足限定条件也可能匹配任意次,相当于 {1,}?。
*? : 尽量不匹配,但是为了满足限定条件也可能匹配任意次,相当于 {0,}?。
找出{{}}内的字符串,{{msg}}, {{person.name}}
str = "{{msg}} - {{person.name}}--}}--{{}}"
// reg = new RegExp(/\{\{(.+)\}\}/g);
reg = new RegExp(/\{\{(.{1,})\}\}/g);
arr = reg.exec(str)
arr2 = str.match(reg)
console.log('exec:', arr)
console.log('match:', arr2)
// exec: (2) ["{{msg}} - {{person.name}}--}}--{{}}", "msg}} - {{person.name}}--}}--{{", index: 0, input: "{{msg}} - {{person.name}}--}}--{{}}", groups: undefined]
// match: ["{{msg}} - {{person.name}}--}}--{{}}"]
// 这是强贪婪模式
// reg = new RegExp(/\{\{(.+?)\}\}/g);
reg = new RegExp(/\{\{(.{1,}?)\}\}/g);
arr = reg.exec(str)
arr2 = str.match(reg)
console.log('exec:', arr)
console.log('match:', arr2)
// exec: (2) ["{{msg}}", "msg", index: 0, input: "{{msg}} - {{person.name}}--}}--{{}}", groups: undefined]
// match: (2) ["{{msg}}", "{{person.name}}"]
// 这是弱贪婪模式
reg = new RegExp(/\{\{(.*?)\}\}/g);
arr = reg.exec(str)
arr2 = str.match(reg)
console.log('exec:', arr)
console.log('match:', arr2)
// exec: (2) ["{{msg}}", "msg", index: 0, input: "{{msg}} - {{person.name}}--}}--{{}}", groups: undefined]
// match: (3) ["{{msg}}", "{{person.name}}", "{{}}"]