探究js正则匹配方法:match和exec

match是字符串方法,写法为:str.match(reg)正则表达式

exec是正则表达式方法,写法为:reg.exec(str)数组

match和exec在匹配成功时返回的都是数组,在没有匹配上时返回的都是null,故在没有深刻了解二者的使用规则前,会误觉得二者的使用效果是同样的,下面在几种状况中对match和exec进行区分。bash

一、全局匹配:

当不使用全局匹配时,二者的匹配效果是同样的,仅返回第一次匹配成功的结果:spa

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);
console.log("exec:",rs_exec);
复制代码

当使用全局匹配时,二者的匹配结果出现区别:code

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);
console.log("match2:",rs_match1);
console.log("exec1:",rs_exec1);
console.log("exec2:",rs_exec2);
复制代码

a、全局匹配时,match会返回全部匹配上的内容;而exec仅匹配单次匹配上的内容cdn

b、全局匹配且进行屡次匹配时,exe会从上次匹配结束的下一位开始匹配,返回本次匹配上的内容,直至无能够匹配的内容,返回nullblog

二、分组:

 无全局匹配分组时,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);
console.log("match2:",rs_match1);
console.log("exec1:",rs_exec1);
console.log("exec2:",rs_exec2);
复制代码

 全局匹配分组时,match和exec返回结果不一样。match会返回全部匹配到的结果;而exec会返回本次匹配到的结果,若表达式中出现分组,则会依次返回本次匹配的所有分组:string

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);
console.log("match2:",rs_match1);
console.log("exec1:",rs_exec1);
console.log("exec2:",rs_exec2);
console.log("exec3:",rs_exec3);
console.log("exec4:",rs_exec4);
复制代码

相关文章
相关标签/搜索