exec() 函数是RegExp对象的一个方法;match()是String对象的一个方法。
正则表达式中,如果没有g,exec和match方法都是返回字符串中第一个匹配的部分,如果有分组的话,分组也会返回;
如果有g,exec每执行一次都会将reg的lastIndex属性更新,下次载执行exec时,会从这个值开始搜索匹配的部分,如果有分组的话,分组也返回;
如果有g,match会将字符串中所有与正则表达式匹配的部分返回,忽视分组。
假设有一个字符串:
str='dwd bill.gates@microsoft.com someone@gmail.com';
匹配邮件的正则表达式:
let re = /([\w\.]+)\@(\w+)\.(\w+)/; // 匹配邮件的正则表达式,并进行了分组,@之前是一组,@到.之间分一组,.之后分一组
没有g:
// 第一次执行re.exec(str) console.log(re.exec(str)); console.log(re.lastIndex); // 0 // 第二次执行re.exec(str) console.log(re.exec(str)); console.log(re.lastIndex); // 0 console.log(str.match(re)); console.log(str.match(re)); /* exec()h和match()返回值一样,不论执行了多少次: [ 'bill.gates@microsoft.com', 'bill.gates', 'microsoft', 'com', index: 4, input: 'dwd bill.gates@microsoft.com someone@gmail.com' ] re.lastIndex的值两次都为0,可以认为在没有g时,没有继续向后序内容匹配的需求,所以lastIndex没有必要更改。 */
有g:
// 第一次执行re.exec(str) console.log(re.exec(str)); console.log(re.lastIndex); // 28 // 第二次执行re.exec(str) console.log(re.exec(str)); console.log(re.lastIndex); // 46 console.log(str.match(re)); console.log(str.match(re)); /* 对于exec来说,有g意味着“我有继续向后序内容匹配的需求”,没调用一次exec就匹配一次,只是每次匹配的起点不同(由lastIndex决定); 对于match来说,有g意味着“我需要得到所有与整条正则表达式(不管分组)匹配的部分”, [ 'bill.gates@microsoft.com', 'bill.gates', 'microsoft', 'com', index: 4, input: 'dwd bill.gates@microsoft.com someone@gmail.com' ] 28 [ 'someone@gmail.com', 'someone', 'gmail', 'com', index: 29, input: 'dwd bill.gates@microsoft.com someone@gmail.com' ] 46 [ 'bill.gates@microsoft.com', 'someone@gmail.com' ] [ 'bill.gates@microsoft.com', 'someone@gmail.com' ] */