match和exec在匹配成功时返回的都是数组,在没有匹配上时返回的都是null,但两者有一定的区别。
1、全局匹配:
当不使用全局匹配时,两者的匹配效果是一样的,仅返回第一次匹配成功的结果:
var s = "aaa bbb ccc";
var reg = /\b\w+\b/; // 没有g
var rs_match = s.match(reg);
var rs_exec = reg.exec(s);
console.log("match:",rs_match); // ['aaa', index: 0, input: 'aaa bbb ccc', groups: undefined]
console.log("exec:",rs_exec); // ['aaa', index: 0, input: 'aaa bbb ccc', groups: undefined]
当使用全局匹配时,两者的匹配结果出现区别:
var s = "aaa bbb ccc";
var reg = /\b\w+\b/g;//有g
var rs_match1 = s.match(reg);
var rs_match2 = s.match(reg);
var rs_exec1 = reg.exec(s);
var rs_exec2 = reg.exec(s);
console.log("match1:",rs_match1); // ['aaa', 'bbb', 'ccc']
console.log("match2:",rs_match1); // ['aaa', 'bbb', 'ccc']
console.log("exec1:",rs_exec1); // ['aaa', index: 0, input: 'aaa bbb ccc', groups: undefined]
console.log("exec2:",rs_exec2); // ['bbb', index: 4, input: 'aaa bbb ccc', groups: undefined]
从示例上面可以看出:
- 全局匹配时,match会返回所有匹配上的内容;而exec仅匹配单次匹配上的内容
- 全局匹配且进行多次匹配时,exe会从上次匹配结束的下一位开始匹配,返回本次匹配上的内容,直至无可以匹配的内容,返回null
2、分组:
无全局匹配分组时,match和exec返回结果相同。由于正则表达式采用了括号分组,所以在返回匹配结果的同时,依次返回该结果的所有分组:
var s = "aaa1 bbb2 ccc3";
var reg = /\b(\w+)(\d{1})\b/;//两个分组,无g
var rs_match1 = s.match(reg);
var rs_match2 = s.match(reg);
var rs_exec1 = reg.exec(s);
var rs_exec2 = reg.exec(s);
console.log("match1:",rs_match1); // ['aaa1', 'aaa', '1', index: 0, input: 'aaa1 bbb2 ccc3', groups: undefined]
console.log("match2:",rs_match1); // ['aaa1', 'aaa', '1', index: 0, input: 'aaa1 bbb2 ccc3', groups: undefined]
console.log("exec1:",rs_exec1); // ['aaa1', 'aaa', '1', index: 0, input: 'aaa1 bbb2 ccc3', groups: undefined]
console.log("exec2:",rs_exec2); // ['aaa1', 'aaa', '1', index: 0, input: 'aaa1 bbb2 ccc3', groups: undefined]
全局匹配分组时,match和exec返回结果不同。match会返回所有匹配到的结果;而exec会返回本次匹配到的结果,若表达式中出现分组,则会依次返回本次匹配的全部分组:
var s = "aaa1 bbb2 ccc3";
var reg = /\b(\w+)(\d{1})\b/g;
var rs_match1 = s.match(reg);
var rs_match2 = s.match(reg);
var rs_exec1 = reg.exec(s);
var rs_exec2 = reg.exec(s);
var rs_exec3 = reg.exec(s);
var rs_exec4 = reg.exec(s);
console.log("match1:",rs_match1); // ['aaa1', 'bbb2', 'ccc3']
console.log("match2:",rs_match1); // ['aaa1', 'bbb2', 'ccc3']
console.log("exec1:",rs_exec1); // ['aaa1', 'aaa', '1', index: 0, input: 'aaa1 bbb2 ccc3', groups: undefined]
console.log("exec2:",rs_exec2); // ['bbb2', 'bbb', '2', index: 5, input: 'aaa1 bbb2 ccc3', groups: undefined]
console.log("exec3:",rs_exec3); // ['ccc3', 'ccc', '3', index: 10, input: 'aaa1 bbb2 ccc3', groups: undefined]
console.log("exec4:",rs_exec4); // null