本文详细解析JavaScript中正则表达式对象的exec方法与字符串对象的match方法。重点阐述两者在有无分组、是否指定全局g属性时的返回值差异:exec始终返回首个匹配及分组信息,而match在指定g时返回所有匹配。通过代码示例对比不同场景下的输出结果,帮助开发者准确选择合适的方法。
exec与match的基本定义与返回值类型
exec属于正则表达式对象的方法,其接收的参数为待匹配的字符串。具体调用方式如下所示:
var re=new RegExp(/\d/);
re.exec( "abc4def" );
//或者使用perl风格:
/\d/.exec( "abc4def" );
//match才是字符串类提供的方法,它的参数是正则表达式对象,如下用法是正确的:
"abc4def".match(\d);
exec与match两个方法最终返回的数据类型均为数组。
当执行exec方法的正则表达式未包含分组(即无括号内容)时,若存在匹配项,返回的数组仅包含一个元素,该元素为正则匹配到的第一个字符串;若未找到匹配,则返回null。
以下两个alert函数弹出的提示信息相同:
无分组场景下的行为对比
var str= "cat,hat" ;
var p=/at/; //没有g属性
alert(p.exec(str))
alert(str.match(p))
输出内容均为"at"。在此类无分组且非全局匹配的场景下,exec的行为等价于match。
然而,若正则表达式设置了全局匹配标志(g属性),上述代码的执行结果将产生差异:
全局匹配g属性对结果的影响
var str= "cat,hat" ;
var p=/at/g; //注意g属性
alert(p.exec(str))
alert(str.match(p))
分别输出
"at"
"at,at"。
这是因为exec方法始终只返回第一个匹配项,而match方法在正则表达式指定了g属性时,会返回所有匹配到的字符串。
若exec找到匹配且正则表达式包含分组,返回的数组将包含多个元素:第一个元素为完整的匹配字符串,后续元素依次为该匹配中第一、第二……个分组(即反向引用)的内容。
运行以下代码将弹出"cat2,at":
包含分组时的返回结构解析
var str= "cat2,hat8" ;
var p=/c(at)\d/;
alert(p.exec(str))
其中数组的第一个元素为匹配的完整字符串"cat2",后续元素为括号内匹配的内容"at"。
match函数在满足特定条件时,可实现与exec相同的功能:
1、正则表达式中包含分组(括号)
2、仅返回唯一的匹配项
参考以下代码:
match实现等效功能的条件
var str= "cat2,hat8" ;
var p=/c(at)\d/;
alert(p.exec(str))
alert(str.match(p))
两者均弹出消息"cat2,at",这是否令人感到意外?
exec与match的核心差异总结
总结:
match方法默认返回所有匹配字符串组成的数组,但必须为正则表达式指定全局g属性才能生效;若不指定g属性,则返回仅含一个元素的数组。
exec方法始终返回与第一个匹配相关的信息,其返回数组包括第一个匹配的子串以及所有分组的反向引用。
在部分情况下,exec返回的结果与match返回的结果一致:
var str= "cat,hat" ;
var p=/at/; //没有g属性
alert(p.exec(str))
alert(str.match(p))
均弹出“at”
在部分情况下,match返回的结果与exec返回的结果一致:
var str= "cat2,hat8" ;
var p=/c(at)\d/;
alert(p.exec(str))
alert(str.match(p))
均弹出“cat2,at”
以上关于JavaScript中exec与match方法的深入剖析即为全部内容,希望能对读者有所帮助,也欢迎大家继续支持本站。