摘要:在本教程中,您将了解 JavaScript 正则表达式捕获组以及如何使用它们为匹配创建子组。
JavaScript 正则表达式捕获组简介
假设您有以下路径
resource/id
Code language: JavaScript (javascript)
例如
posts/10
在路径中,资源是 posts
,id
是 10。要匹配路径,您使用以下 正则表达式
/\w+\/\d+/
Code language: JavaScript (javascript)
在此模式中
以下使用正则表达式 /\w+\/\d+/
模式来匹配字符串 'posts/10'
const path = 'posts/10';
const pattern = /\w+\/\d+/;
const match = path.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
输出
[ 'posts/10', index: 0, input: 'posts/10', groups: undefined ]
Code language: JavaScript (javascript)
要从路径 posts/10
中获取 id 10,您使用捕获组。要为规则创建捕获组,您将该规则放在括号中,如下所示
(rule)
Code language: JavaScript (javascript)
以下示例创建了一个捕获组,该组从路径 posts/10
中捕获 id
值
'\w+/(\d+)'
Code language: JavaScript (javascript)
在此模式中,我们将规则 \d+
放在括号 ()
内。如果您使用新模式运行程序,您将看到它显示了一个匹配项
const path = 'posts/10';
const pattern = /\w+\/(\d+)/;
const match = path.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
输出
[ 'posts/10', '10', index: 0, input: 'posts/10', groups: undefined ]
Code language: JavaScript (javascript)
match()
方法返回一个匹配数组。第一个元素是整个匹配项 ('posts/10'
),而第二个元素 ('10'
) 是捕获组的值。
请注意,如果您设置 g
标志,例如 /\w+\/(\d+)/g
,则 String.match()
方法将不会返回组。如果您使用 g
标志,则需要使用 String.matchAll()
方法来获取组。
多个捕获组
要捕获路径 (post/10
) 的资源 (posts
) 和 id (10
),您在正则表达式中使用多个捕获组,如下所示
/(\w+)\/(\d+)/
Code language: JavaScript (javascript)
正则表达式有两个捕获组,一个用于 \w+
,另一个用于 \d+
。
以下脚本显示了整个匹配项和所有子组
const path = 'posts/10';
const pattern = /(\w+)\/(\d+)/;
const match = path.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
输出
['posts/10', 'posts', '10', index: 0, input: 'posts/10', groups: undefined]
Code language: JavaScript (javascript)
要访问第一个和第二个子组,您使用 match[1]
和 match[2]
。请注意,match[0]
返回整个匹配项。例如
const path = 'posts/10';
const pattern = /(\w+)\/(\d+)/;
const match = path.match(pattern);
console.log(match[0], match[1], match[2]);
Code language: JavaScript (javascript)
输出
posts/10 posts 10
Code language: JavaScript (javascript)
命名捕获组
要访问匹配中的子组,您使用索引。但是,您可能希望通过有意义的名称访问子组,以使其更方便。
为此,您使用**命名捕获组**为组分配名称。以下显示了为捕获组分配名称的语法
(?<name>rule)
Code language: JavaScript (javascript)
在此语法中
()
表示一个捕获组。?<name>
指定捕获组的名称。rule
是模式中的规则。
例如,以下创建了名称
/?<resource>\w+)\/(?<id>\d+/
Code language: JavaScript (javascript)
在此语法中
resource
是第一个捕获组的名称id
是第二个捕获组的名称。
例如
const path = 'posts/10';
const pattern = /(?<resource>\w+)\/(?<id>\d+)/;
const match = path.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
输出
[
'posts/10',
'posts',
'10',
index: 0,
input: 'posts/10',
groups: [Object: null prototype] { resource: 'posts', id: '10' }
]
Code language: JavaScript (javascript)
匹配项具有一个 groups
属性,它是一个对象。match.groups
对象具有属性,其名称是捕获组名称,值是捕获值。例如
const path = 'posts/10';
const pattern = /(?<resource>\w+)\/(?<id>\d+)/;
const match = path.match(pattern);
for (const name in match.groups) {
console.log(name, match.groups[name]);
}
Code language: JavaScript (javascript)
输出
resource posts
id 10
Code language: JavaScript (javascript)
更多命名捕获组示例
以下正则表达式匹配路径 posts/2022/02/18
/\w+\/d{4}\/d{2}\/d{2}/
Code language: JavaScript (javascript)
要捕获资源 (post)、年份 (2022)、月份 (02) 和日期 (18),您使用命名捕获组,如下所示
/(?<resource>\w+)\/(?<year>\d{4})\/(?<month>\d{2})\/(?<day>\d{2})/
Code language: JavaScript (javascript)
此程序使用模式来匹配路径并显示所有子组
const path = 'posts/2022/02/18';
const pattern =
/(?<resource>\w+)\/(?<year>\d{4})\/(?<month>\d{2})\/(?<day>\d{2})/;
const match = path.match(pattern);
console.log(match.groups);
Code language: JavaScript (javascript)
输出
{resource: 'posts', year: '2022', month: '02', day: '18'}
Code language: JavaScript (javascript)
总结
- 将规则放在括号
()
内以创建捕获组。一个正则表达式可以有多个捕获组。 - 使用
(?<capturingGroupName>rule)
为模式中的规则创建命名捕获组。