如何从指定字符串高效提取并格式化日期为目标数组?
解决方案
可以通过正则捕获分组+一次匹配遍历直接生成目标数组,无需先提取原始日期再二次处理,效率更高。核心思路是用正则捕获每个日期的日、月、年组件,直接基于组件生成两种格式的日期,最后按要求合并。
方法一:使用matchAll(简洁现代写法)
const string = '1: Mode: SOME Date range: 01/01/2018-31/12/2018 User: HANS'; // 正则捕获日、月、年分组 const dateRegex = /(\d{2})\/(\d{2})\/(\d{4})/g; // 匹配所有符合格式的日期,拿到分组数据 const dateMatches = [...string.matchAll(dateRegex)]; // 生成YYYY-MM-DD格式数组 const yyyymmddList = dateMatches.map(([, day, month, year]) => `${year}-${month}-${day}`); // 生成YYYYMM格式数组 const yyyymmList = dateMatches.map(([, day, month, year]) => `${year}${month}`); // 合并成目标数组 const finalResult = [...yyyymmddList, ...yyyymmList]; console.log(finalResult); // 输出: ['2018-01-01', '2018-12-31', '201801', '201812']
方法二:使用exec循环(兼容旧环境)
如果需要兼容不支持matchAll的旧环境,可采用exec循环遍历匹配:
const string = '1: Mode: SOME Date range: 01/01/2018-31/12/2018 User: HANS'; const dateRegex = /(\d{2})\/(\d{2})\/(\d{4})/g; const yyyymmddList = []; const yyyymmList = []; let match; // 循环匹配所有日期,提取分组数据 while ((match = dateRegex.exec(string)) !== null) { const [, day, month, year] = match; yyyymmddList.push(`${year}-${month}-${day}`); yyyymmList.push(`${year}${month}`); } const finalResult = [...yyyymmddList, ...yyyymmList]; console.log(finalResult); // 输出目标数组
优势说明
- 仅做一次正则匹配遍历,直接捕获日期的日、月、年组件,避免了先提取原始日期字符串再二次拆分解析的额外开销。
- 两种格式的日期都基于捕获到的组件直接拼接生成,逻辑清晰且性能最优。
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

