You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析与修复方案

你的代码核心问题有两个:

  1. 用match获取所有匹配行后直接逐行替换,没有做去重处理,导致同月份年份的行保留了第一行的日期数字
  2. 第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:03:22