头图

引言

在JavaScript中,正则表达式提供了两种主要方法来查找字符串中与模式匹配的部分:exec()match()。虽然它们都用于匹配字符串,但使用场景和返回值有所不同。

exec()

exec() 方法是 RegExp 对象上的方法,用于执行一个搜索匹配。它返回一个数组,包含匹配到的信息,或者在没有匹配时返回 null

基本语法:

let regex = /pattern/g; // g 代表全局匹配
let result = regex.exec(string);

特点:

  • 如果正则表达式包含全局标志 gexec() 方法会从上次匹配结束的位置开始搜索下一个匹配。如果没有全局标志,它始终从字符串的起始位置开始搜索。
  • 返回的数组中,第一个元素是整个匹配的字符串,之后的元素是括号捕获组的内容(如果有)。数组还包含额外的属性如 index 表示匹配的起始索引,input 表示原始字符串。
  • 可以多次调用 exec() 来查找字符串中的所有匹配,特别是在正则表达式设置了 g 标志的情况下。

示例:

let regex = /\b(\w+)\b/g;
let text = "Hello world, welcome to the universe.";
let matches;

while ((matches = regex.exec(text)) !== null) {
   console.log(`Found match at index ${matches.index}: ${matches[0]} - Group: ${matches[1]}`);
}

match()

match() 方法是字符串对象上的方法,它也用来查找与正则表达式匹配的字符串。不过,其行为会根据正则表达式是否有全局标志 g 而变化。

基本语法:

let result = string.match(regex);

特点:

  • 如果正则表达式没有全局标志 gmatch() 返回一个数组,包含了完整的匹配以及任何括号捕获组。如果没有匹配,则返回 null
  • 当正则表达式包含 g 标志时,match() 返回一个数组,包含了所有非重叠的匹配项。注意,这与 exec() 的连续调用不同,它不会更新搜索的起始位置。
  • 如果正则表达式是空的(即 /./g),并且被应用到一个空字符串上,match() 会返回一个空数组,而不是 null

示例:

let text = "Hello world, welcome to the universe.";
let regexGlobal = /\b(\w+)\b/g; // 全局匹配
let regexNoGlobal = /\b(\w+)\b/; // 非全局匹配

console.log(text.match(regexNoGlobal)); // 返回第一个匹配
console.log(text.match(regexGlobal)); // 返回所有匹配项的数组

写在最后

  • 使用 exec() 时,记得正则表达式对象的状态(如全局匹配的位置)会在每次调用后更新。
  • 使用 match() 时,考虑正则表达式是否带有 g 标志,因为它会影响返回值的形式。
  • 两者都可用于查找匹配,但根据具体需求和偏好选择最适合的方法。

喜欢的话帮忙点个赞 + 关注吧,将持续更新 JavaScript 相关的文章,还可以关注我的公众号 梁三石FE ,感谢您的关注~


梁三石
37 声望9 粉丝