正则表达式匹配日期时间 - 可选后半部分?

时间:2015-05-05 13:24:55

标签: regex

我有一个正则表达式来匹配各种不同的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

它将格式与连字符匹配,但与不包含时间的时间戳匹配。我的印象是添加(?: ?| - ?)将匹配零个或一个空格或零或一个" - " - 现在看着这个,我意识到它更像匹配" - "加上零或一个" "

无论哪种方式,我都不太清楚为什么,(?: ?部分至少没有时间来处理时间戳。

我还尝试将整个后半部分括在括号中并为其添加?修饰符以尝试使整个后半部分可选,这似乎可以在没有时间的情况下修复时间戳,但也会中断带连字符的邮票的匹配。

2 个答案:

答案 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