字符串的match方法与正则的exec方法的区别

  1. match是字符串的方法,exec是正则对象实例的方法
  2. 正则表达式中没有子表达式,且非全局匹配(没有修饰符g),match和exec结果同样都是返回数组
var s ='hello123456数组';
var result1 = s.match(/\d/);
console.log(result1);//["1", index: 5, input: "hello123456数组", groups: undefined]

var result2 = /\d/.exec(s);
console.log(result2);//结果同string.match(reg) 
复制代码
  1. 正则表达式中含有子表达式,且非全局匹配,match和exec结果一致
var s='abc,bbc,cbc,dbc';
var result=/(\w)bc/.exec(s);
console.log(result);

var result2=s.match(/(\w)bc/);
console.log(result2);
//["abc", "a", index: 0, input: "abc,bbc,cbc,dbc", groups: undefined],返回长度为2的数组,第一项时匹配项,第二项是子表达式捕获项,包含属性,index和input,index是匹配项开始的下标


var str = 'abcd';
var re = /(a)(b)(c)/;
console.log( str.match(re) ) //["abc", "a", "b", "c", index: 0, input: "abcd", groups: undefined]
console.log(re.exec(str));//["abc", "a", "b", "c", index: 0, input: "abcd", groups: undefined]

复制代码
  1. 正则表达式中没有子表达式,全局匹配。match返回全部匹配项组成的数组,exec返回一个匹配项的数组
var s = 'abc,bbc,cbc,dbc';
var result = /\wbc/g.exec(s);
console.log(result); //["abc", index: 0, input: "abc,bbc,cbc,dbc", groups: undefined]
var result2 = s.match(/\wbc/g);
console.log(result2); //['abc','bbc','cbc','dbc']
复制代码
  1. 正则表达式中有子表达式,全局匹配。match返回全部匹配项组成的数组,忽略子表达式的捕获项,exec忽略全局匹配。
var s = 'abc,bbc,cbc,dbc';
var result = /(\w)bc/g.exec(s);
console.log(result); //['abc','a'],index为0,input为'abc,bbc,cbc,dbc'
var result2 = s.match(/(\w)bc/g);
console.log(result2); //['abc','bbc','cbc','dbc']
复制代码
  1. exec适合用于循环匹配,虽然全局匹配和非全局的返回值同样,但使用exec循环时,必需要加修饰符g
var s = 'abc,bbc,cbc,dbc';
var reg = /(\w)bc/g;
var resultArr = [];
//循环匹配时,要先将正则表达式定义好,否则每次都是一个新的正则对象,影响lastIndex的变化 
//必定要加修饰符g,lastIndex是匹配项后面的下标,是下一次匹配的开始下标 
//当 exec() 再也找不到匹配的文本时,它将返回 null,并把lastIndex 属性重置为 0
while (result = reg.exec(s)) {
    console.log("lastIndex: " + reg.lastIndex);
    // lastIndex: 3 
    // lastIndex: 7 
    // lastIndex: 11 
    // lastIndex: 15
    resultArr.push(result);
}
console.log(resultArr)
// [Array(2), Array(2), Array(2), Array(2)]
// ["abc", "a", index: 0, input: "abc,bbc,cbc,dbc", groups: undefined]
// ["bbc", "b", index: 4, input: "abc,bbc,cbc,dbc", groups: undefined]
// ["cbc", "c", index: 8, input: "abc,bbc,cbc,dbc", groups: undefined]
// ["dbc", "d", index: 12, input: "abc,bbc,cbc,dbc", groups: undefined]

复制代码

参考资料:1. lastIndex的理解正则表达式