JavaScript正则replace()捕获组错误:日期行分组结果不符预期
问题解决:正则捕获组错误导致的报纸日期分组失败
原始输入文本
Il Piccolo # 22 settembre 2023 Il Piccolo # 21 settembre 2023 Il Piccolo # 22 settembre 2022 Il Piccolo # 21 settembre 2022
期望输出格式
Il Piccolo # settembre 2023 Il Piccolo # settembre 2022
尝试的JavaScript代码
function groupNewspapers(text) { var containsHash = /#\s\d+\s\w+\s\d+/g.test(text); if (containsHash) { var match = text.match(/^([a-zA-Z\s]+)\s#\s\d+\s(\w+\s\d+)/gm); return match.map(function(line) { return line.replace(/^([a-zA-Z\s]+)\s#\s\d+\s(\w+\s\d+)/, '$1 # $2').replace(/^\d+\s\w+\s/, ''); }).join('\n'); } else { return text; } }
当前错误输出
Il Piccolo # 22 settembre 2023 Il Piccolo # 22 settembre 2022
问题分析与修复方案
你的代码核心问题有两个:
- 用
match获取所有匹配行后直接逐行替换,没有做去重处理,导致同月份年份的行保留了第一行的日期数字 - 第二个
replace(/^\d+\s\w+\s/, '')完全无效,因为每行开头是Il Piccolo,根本匹配不上开头的数字
修复后的代码
我们需要提取所有唯一的「报纸名称 + 月份年份」组合,再输出:
function groupNewspapers(text) { // 匹配每行的报纸名称、月份和年份 const regex = /^([a-zA-Z\s]+)\s#\s\d+\s(\w+\s\d+)/gm; const uniqueGroups = new Set(); let match; // 遍历所有匹配结果,存入Set自动去重 while ((match = regex.exec(text)) !== null) { uniqueGroups.add(`${match[1]} # ${match[2]}`); } // 将Set转为数组并换行拼接 return Array.from(uniqueGroups).join('\n'); }
代码说明
- 用
while循环配合regex.exec遍历所有匹配项,避免match方法的局限 - 利用
Set自动去重的特性,确保每个「月份+年份」组合只保留一次 - 直接通过捕获组拼接目标格式字符串,不需要额外的replace操作,更高效准确
测试验证
输入原始文本后,修复后的代码会输出符合预期的结果:
Il Piccolo # settembre 2023 Il Piccolo # settembre 2022
内容的提问来源于stack exchange,提问作者Alex Doc
相关产品推荐
相关产品推荐

