match 和 exec 主要有两点不同:
1.exec是正则表达式的方法,而不是字符串的方法,它的参数才是字符串,如下所示:
var re=new RegExp(/\d/); re.exec( "abc4def" );
或者使用perl风格:
/\d/.exec( "abc4def" );
match才是字符串类提供的方法,它的参数是正则表达式对象,如下用法是正确的:
"abc4def".match(\d);
或者
"abc4def".match("abc");
2.exec和match返回的都是数组
- 执行exec方法的正则表达式没有分组,那么如果有匹配,他将返回一个只有一个元素的数组;如果没有匹配则返回null。
- exec 不支持 i m g
下面两个alert函数弹出的信息是一样的:
var str= "cat,hat" ; var p=/at/; //没有g属性 alert(p.exec(str)) //["at"] alert(str.match(p)) //["at"]
这时exec和match 方法相等
var str= "cat,hat" ; var p=/at/g; //注意g属性 alert(p.exec(str)) //["at"]
alert(str.match(p)) //["at","at"]
因为exec永远只返回第一个匹配,而match在正则指定了g属性的时候,会返回所有匹配。
3.exec如果找到了匹配,而且包含分组的话,返回的数组将包含多个元素,第一个元素是找到的匹配,之后的元素依次为该匹配中的第一、第二...个分组(反向引用)
如下的代码将弹出"cat2,at":
var str= "cat2,hat8" ; var p=/c(at)\d/; alert(p.exec(str)) //["cat2","at"]
match函数在满足如下条件下将越俎代庖,实现和exec一样的功能:
- 1、正则表达式中含有分组(括号)
- 2、返回唯一的匹配 ,不使用 g,m时候
var str= "cat2,hat8" ; var p=/c(at)\d/; alert(p.exec(str)) //["cat2","at"] alert(str.match(p)) //["cat2","at"]
var p=/c(at)\d/g;alert(str.match(p))//["cat2","at"]
4. 分组匹配, (?:) 不参与分组
var regis=/^(?:[a-z]+(\d)|(#))$/; regis.exec("ab2") //["ab2","2",undefined] regis.exec("#") //["#",undefined,"#"] ,注意 "ab#" 返回的是 null
有两个分组,(\d)和 (#),虽然用 | 分隔,但是两个都参与分组
总结:
exec 永远返回的是第一个匹配的元素,如果分组其返回数组包括第一个匹配的字串,以及所有分组的反向引用
match 是返回所有匹配的字符串的数组,但是正则表达式必须指定全局g属性才能返回所有匹配,不指定g属性与exec的效果相同。