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、从匹配原理看
    能达到同样匹配结果的情况下,通常贪婪模式效率较高。
    惰性模式都可通过修改量词修饰的子表达式转换为贪婪模式。
    贪婪模式可以与固化分组结合,提升匹配效率,而惰性模式不行。