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

如何从含波斯历(Shamsi)日期的文本中提取所有日期至数组?

批量提取文本中所有日期并整理为数组的JavaScript方案

需求说明

从包含波斯历(Shamsi)和公历的病理报告文本中提取所有日期,整理为数组形式:

病理报告日期:01.09.1402(22.11.2023):右大腿皮肤Baso-squamous carcinoma。
手术病理报告日期:30.03.1403:右腹股沟肿块metastatic epithelial tumor累及多个淋巴组织。

原代码问题分析

原代码仅能提取单个日期,核心问题:

  • 使用match()未添加全局标志g,仅返回第一个匹配结果
  • 逻辑为覆盖式赋值,最终只返回最后处理的单个日期
  • 未处理括号内的公历日期

修改后的代码实现

const text = `病理报告日期:01.09.1402(22.11.2023):右大腿皮肤Baso-squamous carcinoma。手术病理报告日期:30.03.1403:右腹股沟肿块metastatic epithelial tumor累及多个淋巴组织。`

console.log(getAllDates(text));

function getAllDates(d) {
  // 全局匹配所有 XX.XX.XXXX 格式的日期(含括号内的日期)
  const dateRegex = /\b\d{2}([\-/ \.])\d{2}[\-/ \.]\d{4}\b/g;
  const matches = d.match(dateRegex) || [];
  
  return matches.map(dateStr => {
    // 获取日期分隔符
    const separator = dateStr.match(/[\-/ \.]/)[0];
    const [part1, part2, part3] = dateStr.split(separator);
    let day, month, year;
    
    // 判断日期格式:日.月.年 或 年.月.日
    if (part3.length === 4) {
      day = part1;
      month = part2;
      year = part3;
    } else {
      day = part3;
      month = part2;
      year = part1;
    }
    
    // 兼容格式混淆:若月份大于12则交换日和月
    if (parseInt(month, 10) > 12) {
      [day, month] = [month, day];
    }
    
    return `${day}.${month}.${year}`;
  });
}

代码说明

  1. 全局正则匹配:通过g标志捕获文本中所有符合格式的日期,\b确保匹配完整的日期单元,避免匹配长数字串中的片段
  2. 遍历处理每个日期:用map对每个匹配项单独做格式转换,保证所有日期都被处理
  3. 格式兼容逻辑:自动识别日.月.年或年.月.日格式,同时处理因格式混淆导致的月份超12的情况
  4. 空结果处理:无匹配日期时返回空数组,避免null引发报错

执行后返回结果:

["01.09.1402", "22.11.2023", "30.03.1403"]

内容的提问来源于stack exchange,提问作者sima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:39:51