正则表达式(Regular Expression,简称 Regex)是一种强大的字符串匹配工具,它能够让我们通过模式来查找、匹配、替换字符串中的内容。而在正则表达式中,捕获组是一个非常重要的概念,常常用于将匹配到的内容保存下来供后续操作。今天我们就来详细讲解 JavaScript 中的捕获组、反向引用、以及替换操作中的 、
等符号。
捕获组 是指通过用小括号 ()
将正则表达式中的一部分包裹起来,从而将这部分内容单独保存下来。捕获组不仅可以用来对模式进行分组,还可以将匹配到的内容保存,方便后续的引用和替换。
在 JavaScript 中,创建捕获组非常简单,只需要将正则表达式的一部分用括号 ()
包裹起来即可。
const regex = /(hello) (world)/;
const str = "hello world";
const result = regex.exec(str);
console.log(result);
// 输出: ["hello world", "hello", "world"]
"(hello)"
是第一个捕获组,匹配到的是 "hello"
。"(world)"
是第二个捕获组,匹配到的是 "world"
。result[0]
保存的是整个匹配的字符串 "hello world"
,而 result[1]
和 result[2]
分别保存的是第一个和第二个捕获组的匹配结果。反向引用是指在同一个正则表达式中,引用之前定义的捕获组匹配的内容。通过 、
等符号可以引用之前捕获组中的内容。
代表第一个捕获组的内容。
代表第二个捕获组的内容,以此类推。const regex = /(\d{3})-(\d{3})-/;
const str1 = "123-456-123";
const str2 = "123-456-789";
console.log(regex.test(str1)); // 输出 true
console.log(regex.test(str2)); // 输出 false
在这个例子中:
(\d{3})
是一个捕获组,它匹配三个连续的数字。
引用第一个捕获组,也就是说,第三组数字必须和第一个组匹配的内容相同。str1
中第三组数字是 "123"
,与第一个组匹配的 "123"
相同,因此返回 true
。str2
中,第三组是 "789"
,与第一个组不相同,因此返回 false
。
、
在正则表达式的替换操作中,捕获组同样起到了非常重要的作用。JavaScript 提供了 replace()
方法来进行字符串替换,并允许我们使用 、
等符号来引用捕获组的内容。
引用第一个捕获组匹配到的内容。
引用第二个捕获组匹配到的内容,以此类推。const str = "John Smith";
const regex = /(\w+)\s(\w+)/;
const newStr = str.replace(regex, ", ");
console.log(newStr);
// 输出: "Smith, John"
在这个例子中:
(\w+)
是第一个捕获组,匹配名字 "John"
。(\w+)
是第二个捕获组,匹配姓氏 "Smith"
。", "
在 replace()
中表示将第二个捕获组的内容放在前面,第一个捕获组的内容放在后面。因此,名字和姓氏的顺序被互换,输出结果为 "Smith, John"
。$
符号的其他用法除了在替换操作中用作捕获组的引用,$
在正则表达式中还有其他特殊用途。最常见的是用于匹配字符串的结尾。
const regex = /world$/;
const str1 = "hello world";
const str2 = "hello worlds";
console.log(regex.test(str1)); // 输出 true
console.log(regex.test(str2)); // 输出 false
world$
表示匹配以 "world"
结尾的字符串。"hello world"
以 "world"
结尾,因此匹配成功,返回 true
。"hello worlds"
以 "worlds"
结尾,不符合模式,返回 false
。在有些情况下,我们可能只想对某些部分进行分组,而不希望捕获这些内容。为了实现这一点,JavaScript 支持非捕获组。非捕获组的语法是 (?:...)
。
const regex = /(?:hello) world/;
const str = "hello world";
const result = regex.exec(str);
console.log(result);
// 输出: ["hello world"]
(?:hello)
是一个非捕获组,虽然它会匹配 "hello"
,但不会保存这个匹配结果。捕获组、反向引用、以及替换操作中的 、
是正则表达式中的重要工具,它们极大地提高了我们处理字符串的灵活性和效率。掌握这些知识后,我们可以:
()
将正则表达式中的部分分组并捕获内容。
、
等符号引用之前捕获的内容。
、
在 replace()
中引用捕获组进行复杂的字符串替换。