javascript正则表达式
- 1、贪婪模式(——在匹配成功的前提下,尽可能多的去匹配)——* + {n,}
- 2、惰性模式,量词加? (——在匹配成功的前提下,尽可能少的去匹配)——*? ?? {m,n}? {n}?
- 3、二者比较
1、贪婪模式(——在匹配成功的前提下,尽可能多的去匹配)——* + {n,}
首先比对整个字符串是否匹配,如果匹配不成功则去掉字符串最后一个字符再继续进行匹配,以此类推直到匹配成功或不剩字符才停止。
var strT = '0a123b avcba123';
var patternT = /a[a-b0-9]*b/g;
console.log(strT.match(/a[a-b0-9]*b/g));//["a123b"]
patternT.test(strT);
console.log("3.1、贪婪模式:----------------------");
//工作过程如下:
patternT.test('0a123ba123ba123'); //false 首先比对整个字符串,如果不匹配,删除最后一个字符3继续匹配
patternT.test('0a123ba123ba12'); //false 如果不匹配,删除最后一个字符2再继续匹配
patternT.test('a123ba123b'); //true 匹配成功,停止工作
var str1 = 'aaabcdaaaaa'
console.log(str1.match(/a+/g)); //["aaa", "aaaaa"]
console.log("1、贪婪模式----------------------");
2、惰性模式,量词加? (——在匹配成功的前提下,尽可能少的去匹配)——*? ?? {m,n}? {n}?
首先从字符串第一个字符开始匹配,如果匹配成功则停止匹配,否则加入第二个字符继续匹配,依此类推直到匹配成功或不剩字符才停止。
var strD = '0a123ba123ba123';
var patternD = /a[a-b0-9]*?b/g;
console.log(strD.match(patternD));//["a123b", "a123b"]
patternD.test(strD);
console.log("惰性模式:----------------------");
//工作过程如下:
patternD.test('0'); //false 首先比对第一个字符,如果不匹配,加入第二个字符a继续匹配
patternD.test('0a'); //false 如果不匹配,加入第三个字符1再继续匹配
patternD.test('a123b'); //true 匹配成功,停止工作
var str2 = 'aaabcdaaaaa'
console.log(str2.match(/a?/g)); //["a", "a", "a", "", "", "", "a", "a", "a", "a", "a", ""]
console.log(str2.match(/a+?/g)); //["a", "a", "a", "a", "a", "a", "a", "a"]
console.log("惰性模式----------------------");
3、二者比较
var str3 = 'abacbaxybaabb'
console.log(str3.match(/a.*b/g)); //*最大匹配—— ["abacbaxybaabb"]
console.log(str3.match(/a.*?b/g)); //*最小匹配——["ab", "acb", "axyb", "aab"]
console.log("3、比较----------------------");
1、从语法角度看
贪婪模式用于匹配优先量词修饰的子表达式,匹配优先量词包括:“{m,n}”、“{m,}”、“?”、“*”和“+”。
惰性模式用于匹配忽略优先量词修饰子表达式,匹配忽略优先量词包括:“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。
2、从应用角度看
两者均影响被量词修饰的子表达式匹配行为,贪婪模式在匹配成功的前提下尽可能多地匹配,而惰性模式则在匹配成功的前提下尽可能少匹配。惰性模式只被部分NFA引擎支持。
3、从匹配原理看
能达到同样匹配结果的情况下,通常贪婪模式效率较高。
惰性模式都可通过修改量词修饰的子表达式转换为贪婪模式。
贪婪模式可以与固化分组结合,提升匹配效率,而惰性模式不行。