我有一个正则表达式来匹配各种不同的MM / dd / yy格式时间戳,包括时间。我创建了这个并且它运行良好了一段时间:
(0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d()( (?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)( AM| PM)?)?
https://regex101.com/r/iV1kF8/2
直到我意识到我匹配的时间戳也可以有一个" - "分开日期和时间。我将表达式改为:
(0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d(?: ?| - ?)(?:(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)( AM| PM)?)
https://regex101.com/r/iV1kF8/3
它将格式与连字符匹配,但与不包含时间的时间戳匹配。我的印象是添加(?: ?| - ?)
将匹配零个或一个空格或零或一个" - " - 现在看着这个,我意识到它更像匹配" - "加上零或一个" "
无论哪种方式,我都不太清楚为什么,(?: ?
部分至少没有时间来处理时间戳。
我还尝试将整个后半部分括在括号中并为其添加?
修饰符以尝试使整个后半部分可选,这似乎可以在没有时间的情况下修复时间戳,但也会中断带连字符的邮票的匹配。
答案 0 :(得分:1)
我认为你正在寻找这个正则表达式:
(0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d((?: |\s*-\s*)(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)( AM| PM)?)?
请参阅demo
我刚刚添加了(?: |\s*-\s*)
并删除了空圆括号。
答案 1 :(得分:1)
您可以使用以下内容:
(0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d ?-?( ?(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)( AM| PM)?)?
请参阅DEMO