正则表达式通过捕获组提取日期组件,再拼接实现格式化;支持ISO、美式斜杠、中文等格式;需补零并校验月份1–12、日期1–31;结合上下文和业务约定消除歧义。
正则表达式本身不直接“格式化”日期,但它能精准提取、验证和重组日期字符串中的年月日部分,为后续格式化提供结构化数据。关键在于用捕获组提取原始日期的各组件,再按目标格式拼接。
识别并提取日期组件
不同来源的日期格式各异(如2023-05-12、12/05/2023、2023年5月12日),需先用带捕获组的正则匹配出年、月、日:
-
ISO 格式(YYYY-MM-DD):
/^(\d{4})-(\d{1,2})-(\d{1,2})$/→ 捕获组1=年,2=月,3=日 -
美式斜杠(MM/DD/YYYY):
/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/→ 组1=月,组2=日,组3=年 -
中文格式:
/^(\d{4})年(\d{1,2})月(\d{1,2})日$/→ 组1=年,组2=月,组3=日
统一补零与校验基础有效性
提取后常需补零(如5→05)并做简单合理性检查(如月份1–12、日期1–31):
- 用
String.prototype.padStart(2, '0')对月、日补零 - 手动判断:
month >= 1 && month ,<code>day >= 1 && day (更严格的天数校验需结合年份和月份) - 注意:正则无法判断2023-02-30是否真实存在,这部分需额外逻辑
按目标格式重组字符串
拿到标准化的年、月、日数字后,按需拼接即可:
- 转为YYYY/MM/DD:
`${year}/${monthStr}/${dayStr}` - 转为DD.MM.YYYY:
`${dayStr}.${monthStr}.${year}` - 转为YYYY年MM月DD日:
`${year}年${monthStr}月${dayStr}日`
处理模糊或不规范输入
面对2023/5/1或1-12-2023这类无补零、顺序不定的字符串,可先用更宽松正则粗提数字,再结合上下文或默认规则推断:
- 用
/\b(\d{1,4})[/-\.](\d{1,2})[/-\.](\d{1,4})\b/匹配三组数字 - 根据数值范围(如某组>12→大概率是年份)和常见习惯(如首位>31则不是日)辅助判断顺序
- 明确业务场景下约定优先级(如公司系统默认为YYYY-MM-DD),避免歧义

















