返回

正则表达式学习笔记三——$、&、`、'、n匹配及捕获分组使用技巧

前端

在前面的笔记中,我们已经学习了正则表达式的基本语法和一些常用的匹配模式。在本节中,我们将继续深入学习正则表达式的其他匹配技巧,包括$、&、`、'和n的使用,以及捕获分组的概念和用法。

$、&、`、'、n的使用

在正则表达式中,$、&、`、'和n这几个字符具有特殊的匹配含义。具体如下:

  • :匹配字符串的末尾。例如,正则表达式"xyz"将匹配以"xyz"结尾的任何字符串。
  • &:匹配匹配到的子串。例如,正则表达式"(xyz)xyz"将匹配任何以"xyz"开头的字符串,并将"xyz"子串捕获为分组1。
  • :匹配当前匹配的子串左边的内容。例如,正则表达式"xyz`xyz"将匹配任何以"xyz"结尾的字符串,并将"xyz"子串左边的内容捕获为分组1。
  • ':匹配当前匹配的子串右边的内容。例如,正则表达式"xyz`"将匹配任何以"xyz"开头的字符串,并将"xyz"子串右边的内容捕获为分组1。
  • n:假如第一个参数是 RegExp 对象,并且 n 是个小于100的非负整数,那么插入第 n 个匹配子串。例如,正则表达式"(.)(.)"将匹配任何由两个字符组成的字符串,并将第一个字符捕获为分组1,第二个字符捕获为分组2。

捕获分组

在正则表达式中,可以使用圆括号()来定义捕获分组。捕获分组可以捕获匹配到的子串,并将其存储为一个分组。分组的编号从1开始,按照出现的顺序递增。

例如,正则表达式"(xyz)(abc)"将匹配任何包含"xyz"和"abc"子串的字符串,并将"xyz"子串捕获为分组1,"abc"子串捕获为分组2。

捕获分组可以用于多种用途,例如:

  • 从字符串中提取数据:可以使用捕获分组从字符串中提取特定的数据。例如,正则表达式"(?p.*)"将匹配任何包含一个名称的字符串,并将名称捕获为分组1。
  • 替换字符串:可以使用捕获分组来替换字符串中的特定部分。例如,正则表达式"s/(?p.*)/$name,/"将匹配任何包含一个名称的字符串,并将名称替换为"name,"。
  • 验证字符串:可以使用捕获分组来验证字符串是否符合特定的格式。例如,正则表达式"^.{8,20}$"将匹配任何长度在8到20个字符之间的字符串。

实例

提取数据

使用正则表达式提取数据是一个非常常见的应用场景。例如,我们可以使用正则表达式从HTML代码中提取链接、从电子邮件地址中提取用户名、从日志文件中提取错误消息等等。

const html = '<a href="https://example.com">Example</a>';
const regex = /href="(.+?)"/;
const match = regex.exec(html);
const link = match[1];
console.log(link); // https://example.com

替换字符串

使用正则表达式替换字符串也是一个非常常见的应用场景。例如,我们可以使用正则表达式将字符串中的所有空格替换为连字符、将字符串中的所有数字替换为星号等等。

const str = 'Hello, world!';
const regex = /\s+/g;
const newStr = str.replace(regex, '-');
console.log(newStr); // Hello---world!

验证字符串

使用正则表达式验证字符串是否符合特定的格式也是一个非常常见的应用场景。例如,我们可以使用正则表达式验证电子邮件地址、电话号码、身份证号码等等。

const email = 'example@gmail.com';
const regex = /^.+@.+\..+$/;
const isValid = regex.test(email);
console.log(isValid); // true

总结

在本节中,我们学习了正则表达式的$、&、`、'、n的使用方法,以及捕获分组的概念和用法。这些都是正则表达式非常重要的知识点,掌握了这些知识点,我们可以更加灵活地使用正则表达式来解决各种问题。