如何使用 ECMAScript 2018 的正则表达式命名捕获组
介绍
在 ECMAScript 2018 中, 可以通过命名捕获组的方式为正则表达式捕获的字符串设置名称。这种引入了命名捕获组的正则表达式可以更加清晰和易于理解。
传统捕获组是匹配字符串中的某个部分,并将其存储到一个数组中。而命名捕获组则是将匹配到的字符串存储到一个对象中,并以指定的名称进行命名。这使得捕获到的字符串的用途更加直观。
用途
命名捕获组可以用来实现更加清晰、易于理解的正则表达式。下面是一些用途的示例:
- 分析 URL 中的各个部分
以下是一个 URL 的示例:
const url = 'https://example.com/user/123';
我们可以使用命名捕获组来将 URL 中各个部分分解开来,如下所示:
const urlRegEx = /^((?<protocol>https?):\/\/)((?<domain>[^/?#]*))(?<path>[^?#]*)(\?(?<query>[^#]*))?(#(?<hash>.*))?/i; const match = url.match(urlRegEx); console.log(match.groups);
输出如下:
{ protocol: 'https:', domain: 'example.com', path: '/user/123', query: undefined, hash: undefined }
- 解析日志文件的消息
以下是一个日志文件的示例:
2022-01-03T19:00:00.000Z [INFO] User logged in: {username: 'testuser'}
我们可以使用命名捕获组来解析出日志文件中的消息,如下所示:
const logRegEx = /(?<timestamp>[^\s]+)\s+\[(?<level>[^\]]+)\]\s+(?<message>.+)/; const log = "2022-01-03T19:00:00.000Z [INFO] User logged in: {username: 'testuser'}"; const match = log.match(logRegEx); console.log(match.groups);
输出如下:
{ timestamp: '2022-01-03T19:00:00.000Z', level: 'INFO', message: "User logged in: {username: 'testuser'}" }
语法
命名捕获组的语法是 (?<name>...)
,其中 name
是命名捕获组的名称。命名捕获组的名称只能由字母、数字和下划线组成,并且不能以数字开头。
以下是一个示例,展示如何使用命名捕获组来匹配日期:
const dateRegEx = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const match = "2022-01-03".match(dateRegEx); console.log(match.groups);
输出如下:
{ year: '2022', month: '01', day: '03' }
结论
命名捕获组是 ECMAScript 2018 中的一个新特性,使得正则表达式变得更加清晰和可读。使用命名捕获组,可以更加方便地提取正则表达式中所需的信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6712d722ad1e889fe208b54f