正则表达式帮助:在表达式中添加 24 小时

Posted

技术标签:

【中文标题】正则表达式帮助:在表达式中添加 24 小时【英文标题】:Regular expression help: add 24-hour to expression 【发布时间】:2015-11-10 08:11:32 【问题描述】:

我有一个正则表达式,我需要将 24 小时时间格式添加到:

^(((((0[13578])|([13578])|(1[02]))[\-\/\s]?((0[1-9])|([1-9])|([1-2][0-9])|(3[01])))|((([469])|(11))[\-\/\s]?((0[1-9])|([1-9])|([1-2][0-9])|(30)))|((02|2)[\-\/\s]?((0[1-9])|([1-9])|([1-2][0-9]))))[\-\/\s]?\d4)(\s(((0[1-9])|([1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]2,2)))?$

我将如何添加 24 小时时间格式。

【问题讨论】:

你能举例说明你希望匹配的字符串是什么样子吗? @ndn ex。 2013 年 12 月 30 日 20:14,但 2013 年 12 月 30 日 24:00 除外。 使用正则表达式的日期是一个很大的禁忌。会计闰年简直太糟糕了。 你可能会在这里得到一些线索:***.com/questions/24375711/… 不要使用正则表达式进行完整日期验证。月份在 1 到 12 之间,日期在 1 到 31 之间,年份在 1800 到 2100 之间的基本健全性检查是合理的。真实日期验证应该涉及尝试通过编程语言将值转换为日期。 【参考方案1】:

TLDR:不要用正则表达式搞定!


时间部分:
/(?:[01]\d|2[0-3]):[0-5]\d/

日期部分的基本尝试:

/(?:0[1-9]|1[0-2])\/(?:0[1-9]|[12]\d|3[01])\/\d4,/

在日期部分进行更高级的尝试(验证正确,2 月除外):

/(?:(?:0[13578]|1[02])\/(?:0[1-9]|[12]\d|3[01])|(?:0[2469]|11)\/(?:0[1-9]|[12]\d|30))\/\d4,/

更进一步,假设每一年都是闰年:

/(?:(?:0[13578]|1[02])\/(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)\/(?:0[1-9]|[12]\d|30)|02\/(?:0[1-9]|[12]\d))\/\d4,/

4整除:

/\d*(?:[13579][26]|[02468][048])(?!\d)/

不能被100整除或被400整除:

/\d*(?:(?!\d200)|(?=(?:[13579][26]|[02468][048])00))\d4(?!\d)/

是闰年:

/\d*(?:(?:(?!\d200)(?=\d2(?:[13579][26]|[02468][048])))|(?=(?:[13579][26]|[02468][048])00))\d4(?!\d)/

仅有效的二月日期:

/02\/(?:0[1-9]|1\d|2[0-8]|29(?=\/\d*(?:(?:(?!\d200)(?=\d2(?:[13579][26]|[02468][048])))|(?=(?:[13579][26]|[02468][048])00))\d4(?!\d)))\/\d4,/

有效日期:

/(?:(?:0[13578]|1[02])\/(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)\/(?:0[1-9]|[12]\d|30)|02\/(?:0[1-9]|1\d|2[0-8]|29(?=\/\d*(?:(?:(?!\d200)(?=\d2(?:[13579][26]|[02468][048])))|(?=(?:[13579][26]|[02468][048])00))\d4(?!\d))))\/\d4,/


现在一切都在一个地方!

日期和时间:

/^(?:(?:0[13578]|1[02])\/(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)\/(?:0[1-9]|[12]\d|30)|02\/(?:0[1-9]|1\d|2[0-8]|29(?=\/\d*(?:(?:(?!\d200)(?=\d2(?:[13579][26]|[02468][048])))|(?=(?:[13579][26]|[02468][048])00))\d4(?!\d))))\/\d4, (?:[01]\d|2[0-3]):[0-5]\d$/


这可以简化吗?明确地!

我会这样做吗?见鬼!

我认为信息很明确 - 不要这样做

【讨论】:

同意环视是处理闰年和闰月长度的一种比纯交替更好的方法。 请加强建议不要使用正则表达式执行此操作。一些解释为什么。然后在您提供的正则表达式之前发出强烈警告,表明它充满错误,可能无法工作,无法理解或维护,并且只能由海盗老鼠、AWOL 阳光和愚蠢的开发人员使用。 @ErikE,我认为开头和结尾的粗体字就足够了。为什么使用它是一个坏主意应该是相当明显的。顺便说一句,我敢让你尝试打破它! xd 我觉得粗体字不够用。人们总是越过警告。为了让他们停下来,你必须解释原因。你不能让马喝水,但你应该先把他带到水边,而不是大手大脚地挥手说水在山上某处。

以上是关于正则表达式帮助:在表达式中添加 24 小时的主要内容,如果未能解决你的问题,请参考以下文章

强大的正则表达式

每日一道招式:正则表达式验证24小时的时间

创建正则表达式以匹配 00:00:00 的格式持续时间(不是时间)

如何在正则表达式匹配的字符串开头添加字符?

半小时学会正则表达式(上)

Ansible:带有正则表达式的lineinfile模块并循环添加没有正则表达式的行