match是字符串方法,写法为:str.match(reg)
exec是正则表达式方法,写法为:reg.exec(str)
一 相同点
match和exec在匹配成功时返回的都是数组,在没有匹配上时返回的都是null
二 不同点
1、全局匹配:
当不使用全局匹配时,两者的匹配效果是一样的,仅返回第一次匹配成功的结果:
var s = "ha he ha";
var reg = /h[ae]/; // 没有g
var match = s.match(reg);
var exec = reg.exec(s);
console.log(match); // [ "ha" ]
console.log(exec); // [ "ha" ]
当使用全局匹配时,两者的匹配结果出现区别:
var s = "ha he ha";
var reg = /h[ae]/g;//有g
var match1 = s.match(reg);
var match2 = s.match(reg);
var exec1 = reg.exec(s);
var exec2 = reg.exec(s);
console.log("match1:",match1); // [ "ha", "he", "ha" ]
console.log("match2:",match1); // [ "ha", "he", "ha" ]
console.log("exec1:",exec1); // [ "ha" ]
console.log("exec2:",exec2); // [ "he" ]
a、全局匹配时,match会返回所有匹配上的内容;而exec仅返回单次匹配的内容
b、全局匹配且进行多次匹配时,exe会从上次匹配结束的下一位开始匹配,返回本次匹配上的内容,直至没有可以匹配的内容,返回null,之后重新开始匹配
2、分组:
无全局匹配分组时,match和exec返回结果相同。由于正则表达式采用了括号分组,所以在返回匹配结果的同时,依次返回该结果的所有分组:
var s = “ha he ha”;
var reg = /(ha) (he)/;//两个分组,无g
var match1 = s.match(reg);
var match2 = s.match(reg);
var exec1 = reg.exec(s);
var exec2 = reg.exec(s);
console.log(“match1:”,match1); // [ “ha he”, “ha”, “he” ]
console.log(“match2:”,match1); // [ “ha he”, “ha”, “he” ]
console.log(“exec1:”,exec1); // [ “ha he”, “ha”, “he” ]
console.log(“exec2:”,exec2); // [ “ha he”, “ha”, “he” ]
全局匹配分组时,match和exec返回结果不同。match会返回所有匹配到的结果;而exec会返回本次匹配到的结果,若表达式中出现分组,则会依次返回本次匹配的全部分组:
var s = "gg1 jj2 zz3";
var reg = /\b(\w+)(\d)\b/g;
var match1 = s.match(reg);
var match2 = s.match(reg);
var exec1 = reg.exec(s);
var exec2 = reg.exec(s);
var exec3 = reg.exec(s);
var exec4 = reg.exec(s);
console.log("match1:",match1);
console.log("match2:",match1);
console.log("exec1:",exec1);
console.log("exec2:",exec2);
console.log("exec3:",exec3);
console.log("exec4:",exec4);
match1:
Array(3) [ "gg1", "jj2", "zz3" ]
match2:
Array(3) [ "gg1", "jj2", "zz3" ]
exec1:
Array(3) [ "gg1", "gg", "1" ]
exec2:
Array(3) [ "jj2", "jj", "2" ]
exec3:
Array(3) [ "zz3", "zz", "3" ]
exec4: null