在 JavaScript 中,exec()
和 match()
都是与正则表达式相关的常用方法,但它们的使用方式和返回的结果有所不同。
exec()
方法
exec()
是 RegExp
对象的一个方法,用于在字符串中执行一次正则表达式匹配。它的语法是:
regexp.exec(string)
其中 regexp
是一个正则表达式对象,string
是要在其中执行匹配的字符串。
exec()
方法返回一个数组,包含匹配的结果。如果没有匹配项,则返回 null
。返回的数组包含特定的属性:
index
:匹配项在字符串中的位置。input
:被查找的原始字符串。groups
:命名捕获组的对象(如果正则表达式中有命名捕获组的话)。
如果正则表达式包含全局标志 g
,exec()
方法的行为会有所不同。在带有 g
标志的情况下,每次调用 exec()
都会返回字符串中的下一个匹配项,直到没有更多的匹配项为止。每次调用后,正则表达式对象的 lastIndex
属性都会更新,以反映下一次匹配开始的位置。
match()
方法
match()
是字符串对象的一个方法,用于在字符串中检索与正则表达式匹配的项。它的语法是:
str.match(regexp)
其中 str
是字符串对象,regexp
可以是正则表达式对象或者正则表达式字面量。
match()
方法返回一个数组,包含字符串中所有与正则表达式匹配的项。如果没有匹配项,则返回 null
。如果正则表达式没有全局标志 g
,match()
的行为类似于 regexp.exec(str)
,但返回的是整个匹配结果的数组,而不是包含匹配信息的数组数组。如果正则表达式包含 g
标志,match()
会返回所有匹配项的数组。
区别
- 调用者不同:
exec()
是RegExp
对象的方法,而match()
是字符串对象的方法。 - 返回值:在不使用全局标志
g
的情况下,两者都返回包含匹配结果的数组。但在使用g
时,exec()
在每次调用时返回下一个匹配项,而match()
返回所有匹配项的数组。 - 用途:
exec()
更适用于在循环中逐个检索匹配项,特别是当需要访问正则表达式的lastIndex
属性时。而match()
则更直接地返回所有匹配项,适合一次性获取所有匹配结果。
示例
let str = "The rain in SPAIN stays mainly in the plain"; let regex = /ain/g; // 使用 exec() let execResult; while ((execResult = regex.exec(str)) !== null) { console.log(execResult[0]); // 依次输出 "ain", "ain", "ain" } // 使用 match() let matchResult = str.match(regex); console.log(matchResult); // 输出 ["ain", "ain", "ain"]
在这个例子中,exec()
在循环中被用来逐个检索匹配项,而 match()
则直接返回所有匹配项的数组。