正则表达式帮助:在表达式中添加 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 小时的主要内容,如果未能解决你的问题,请参考以下文章