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

匹配M/DD/YY Time格式日期的正则表达式问题求助

正则表达式匹配"M/DD/YY Time"格式问题解决

问题核心

你需要匹配M/DD/YY Time格式的日期(示例:3/21/22 6:00 AM),但现有正则无法匹配开头的月份"3",本质是月份部分的正则逻辑混乱,同时你对|分支运算符、1\d/2\d的作用存在误解。

先拆解你疑问的知识点

1. |(或运算符)的作用

|代表分支选择,正则引擎会从左到右依次尝试每个分支,只要某一个分支匹配成功,就会停止后续分支的匹配。比如a|b会匹配字符串中的"a"或者"b"。

2. 1\d、2\d的工作逻辑

  • 1\d:匹配以"1"开头的任意一位数字,也就是10-19范围内的数
  • 2\d:匹配以"2"开头的任意一位数字,也就是20-29范围内的数

但你把这两个规则放到月份匹配里完全错误——月份范围是1-12,根本不需要匹配10-29的数值。

现有正则的问题

你写的月份部分:((0?[1-9]|1[012])|\d|1\d|2\d|3[01])
这里的问题非常明显:

  • 第一个分支(0?[1-9]|1[012])其实已经正确覆盖了所有合法月份:01-09或1-9(0?[1-9])、10-12(1[012])
  • 后面追加的|\d|1\d|2\d|3[01]都是多余且冲突的分支:\d会匹配0-9的任意数字(包括0,这是非法月份),1\d/2\d匹配的是10-29(超出月份范围),3[01]是日期的合法值(30/31),完全不该出现在月份规则里。这些冗余分支会干扰正则引擎的匹配逻辑,导致合法月份无法被正确捕获。

修正后的正则

针对M/DD/YY Time格式,正确的正则表达式如下:

^(0?[1-9]|1[012])\/(0?[1-9]|[12]\d|3[01])\/(\d{2}) ([01]?\d|1[0-2]):[0-5]\d ([AaPp][Mm])$

逐部分解释

  • 月份:0?[1-9]|1[012]
    • 0?[1-9]:匹配1-9,允许带前导0(比如3或03)
    • 1[012]:匹配10、11、12
  • 日期:0?[1-9]|[12]\d|3[01]
    • 0?[1-9]:匹配1-9,允许带前导0
    • [12]\d:匹配10-29
    • 3[01]:匹配30、31
  • 年份:\d{2}:匹配任意两位数字(比如22)
  • 小时:[01]?\d|1[0-2]
    • [01]?\d:匹配0-19的数,允许带前导0(比如6或06)
    • 1[0-2]:匹配10、11、12(符合12小时制规则)
  • 分钟:[0-5]\d:匹配00-59的合法分钟值
  • AM/PM:[AaPp][Mm]:不区分大小写匹配AM或PM

验证测试

对于你的测试用例3/21/22 6:00 AM,修正后的正则可以完美匹配:

  • 月份3匹配0?[1-9]
  • 日期21匹配[12]\d
  • 年份22匹配\d{2}
  • 小时6匹配[01]?\d
  • 分钟00匹配[0-5]\d
  • AM匹配[AaPp][Mm]

内容的提问来源于stack exchange,提问作者Michał Mańkowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:40:23