正则表达式分组

使用 () 的捕获组和反向引用,将模式的一部分分组以捕获和重用匹配的子字符串。

正则表达式分组 (Group) 使用括号 () 将模式的一部分括起来进行分组。主要有三种类型:捕获组 (...)、命名捕获组 (?<name>...) 和非捕获组 (?:...)。每种类型用途不同,合理使用可以提高正则表达式的可读性和性能。

捕获组会记住匹配的子字符串,可通过反向引用或替换操作重用。在 JavaScript 中,match()exec() 的结果数组中包含捕获组的值。例如,/(\d{4})-(\d{2})-(\d{2})/ 匹配日期字符串后,可以分别提取年、月、日。探索鹅肝 (Amazon)介绍了分组的高级用法。

命名组 (?<name>...) 允许通过 groups.name 访问,大幅提高了可读性。使用 /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/ 可以通过 result.groups.year 获取年份,比编号引用更清晰。

非捕获组 (?:...) 只进行分组而不记住匹配结果。在不需要捕获的场景中使用可以减少内存消耗并提高性能。例如,(?:http|https):// 对 URL 协议部分进行分组但不捕获。

反向引用 \1\2 可以匹配之前捕获组捕获的相同字符串。常用于验证 HTML 开始标签和结束标签是否匹配 <(\w+)>.*?</\1>,以及检测重复单词 (\w+)\s+\1。在替换操作中,$1$2 引用捕获组内容,实现文本重组。查看体味护理 (Amazon)展示了反向引用的实际应用。

在字符计数方面,分组可以从文本中提取特定模式并统计其出现次数或字符数。例如,用分组捕获 URL 或电子邮件地址,就能统计正文中包含多少个这类元素。

分享这篇文章