正则表达式仅负责精准提取结构化字段,归一化需结合逻辑判断与格式重建:先用泛化分隔符和分组捕获提取年月日等成分,再逐字段校验范围、补零、标准化,最后按模板拼接为统一格式。

正则表达式本身不直接“归一化”字符串,而是为归一化提供精准的识别与提取能力。真正实现归一化的,是结合正则匹配 + 逻辑判断 + 格式重建的组合流程。关键在于:先用正则准确切分/捕获结构化成分,再按规则补零、校验、拼接,而非靠单条正则直接替换出目标格式。
聚焦可提取的结构化模式
归一化前必须明确目标格式的结构约束(如年份4位、月份01–12)。正则的作用是可靠地从中提取出年、月、日、时、分、秒、毫秒等字段,尤其要处理分隔符不固定、空格混杂、位数不齐等情况。
- 用非字母分隔符通用匹配:例如
[\s/:\-\.]*代替硬编码的-或/,适应"2020/01-04 20:30:15"或"2020 01 04 20 30 15" - 用分组捕获确保顺序与含义:如
(\d{4})[\s/:\-\.]+(\d{1,2})[\s/:\-\.]+(\d{1,2})可捕获年月日,后续再统一补零为01、04 - 避免过度贪婪:对时间部分使用
(\d{1,2})(?![\d])防止把123误判为12和3
分阶段校验与填充
提取后不能直接拼接,需逐字段验证合理性并标准化。正则只负责“找”,逻辑负责“判”和“修”。
- 年份必须为4位且在合理范围(如1900–2100),否则舍弃整条
- 月份必须为1–12,不足两位自动补前导零;若为
1或12,补成01或12 - 日期、小时、分钟、秒同理校验范围,超限则截断或置零(如小时25→置0,保留日期)
- 毫秒若存在但不足3位(如
5或32),补零至3位;若不存在,默认为000
规避常见陷阱
很多归一化失败源于忽略边界情况,正则设计需主动防御。
-
拒绝含字母的输入:开头就用
^[^a-zA-Z]*$快速过滤掉"Jan 2020"或"2020-01-04T12:00:00Z"等含英文的格式 -
区分时间戳与普通数字串:10位或13位纯数字优先走时间戳解析(转为毫秒再格式化),避免把
"20200104"误判为时间戳 -
空格与制表符统一处理:用
\s+替代多个空格,再用trim()清理首尾,防止因空白导致分组错位 - 不依赖单一正则全覆盖:对
"20200104122436350"这类无分隔紧凑格式,需单独分支按位数切分,而非强塞进同一正则
输出严格对齐目标格式
最终拼接不拼凑,而是按预设模板填空。例如:
- 仅有年月日 →
"2020-01-04" - 含年月日+时分 →
"2020-01-04 12:24:00"(秒默认00) - 含毫秒 →
"2020-01-04 12:24:36.350"(注意小数点,非冒号) - 所有分隔符统一为
-、:、.,不保留原始符号











