如何从含波斯历(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}`; }); }
代码说明
- 全局正则匹配:通过
g标志捕获文本中所有符合格式的日期,\b确保匹配完整的日期单元,避免匹配长数字串中的片段 - 遍历处理每个日期:用
map对每个匹配项单独做格式转换,保证所有日期都被处理 - 格式兼容逻辑:自动识别
日.月.年或年.月.日格式,同时处理因格式混淆导致的月份超12的情况 - 空结果处理:无匹配日期时返回空数组,避免
null引发报错
执行后返回结果:
["01.09.1402", "22.11.2023", "30.03.1403"]
内容的提问来源于stack exchange,提问作者sima
相关产品推荐
相关产品推荐

