彻底搞懂javascript中的match, exec的区别

在工作中经常发现一些同学把这两个方法搞混,以致把自己弄的很郁闷。所以我和大家一起来探讨一下这两个方法的奥妙之处吧。

我们分以下几点来讲解:

 

相同点:

1.两个方法都是查找符合条件的匹配项,并以数组形式返回。2.当没有找到匹配项时,都返回null。3.当正则表达式包含子表达式且不包含全局标志g时,二者返回相同的数组。

 

示例:

var str = 'cat10,bat20,kat30';var patten = /\w(at)\d+/;var arr = str.match(patten);arr[0] <=> ['cat10']arr[1] <=> ['at']

var arr = patten.exec(str);arr[0] <=> ['cat10']arr[1] <=> ['at']

区别

1.match是字符串的方法,exec是RegExp对象的方法

示例:

var str = 'cat,bat,kat';var patten = /at/;str.match(patten);  //atpatten.exec(str);   //at

 

2.当正则表达式带有全局标志g时,二者表现不一致。

match会返回所有符合条件的匹配项,并以数组形式返回。数组第一项存放第一个匹配项,数组第二项存放第二个匹配项...依次类推。

exec则永远返回第一个匹配项。但是当连续调用exec时,则每次的返回值都是下一个匹配项。

示例1:

var str = 'cat,bat,kat';var patten = /at/g;str.match(patten);  //['at', 'at', 'at']patten.exec(str);  //['at']

示例2:

var str = 'cat,bat,kat';var patten = /\w+/g;str.match(patten);  //['cat', 'bat', 'kat']

//第一次调用patten.exec(str);  //['cat']//第二次调用patten.exec(str);  //['bat']//第三次调用patten.exec(str);  //['kat']

3.当正则表达式包含子表达式时且包含全局标志g时,二者表现不一致。

match会返回所有符合条件的匹配项,并以数组形式返回。这时,match不会再返回子表达式的匹配项了。数组第一项存放第一个匹配项,数组第二项存放第二个匹配项...依次类推。exec会返回子表达式的匹配项。换句话说就是,数组第一项存放整个匹配项,数组第二项存放第一个子表达式匹配项,数组第三项存放第二个子表达式匹配项...依次类推。

示例:

var str = 'cat10,bat20,kat30';var patten = /\w(at)\d+/g;var arr = str.match(patten);  //['cat10', 'bat20', 'kat30']var arr = patten.exec(str);arr[0] <=> ['cat10']arr[1] <=> ['at']

13人参与, 0条评论 登录后显示评论回复

你需要登录后才能评论 登录/ 注册