【问题标题】:Regular expression help: add 24-hour to expression正则表达式帮助:在表达式中添加 24 小时
【发布时间】: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]?\d{4})(\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 除外。
  • 使用正则表达式的日期是一个很大的禁忌。会计闰年简直太糟糕了。
  • 你可能会在这里得到一些线索:stackoverflow.com/questions/24375711/…
  • 不要使用正则表达式进行完整日期验证。月份在 1 到 12 之间,日期在 1 到 31 之间,年份在 1800 到 2100 之间的基本健全性检查是合理的。真实日期验证应该涉及尝试通过编程语言将值转换为日期。

标签: javascript c# asp.net regex


【解决方案1】:

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


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

日期部分的基本尝试:

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

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

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

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

/(?:(?: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))\/\d{4,}/

4整除:

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

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

/\d*(?:(?!\d{2}00)|(?=(?:[13579][26]|[02468][048])00))\d{4}(?!\d)/

是闰年:

/\d*(?:(?:(?!\d{2}00)(?=\d{2}(?:[13579][26]|[02468][048])))|(?=(?:[13579][26]|[02468][048])00))\d{4}(?!\d)/

仅有效的二月日期:

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

有效日期:

/(?:(?: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*(?:(?:(?!\d{2}00)(?=\d{2}(?:[13579][26]|[02468][048])))|(?=(?:[13579][26]|[02468][048])00))\d{4}(?!\d))))\/\d{4,}/


现在一切都在一个地方!

日期和时间:

/^(?:(?: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*(?:(?:(?!\d{2}00)(?=\d{2}(?:[13579][26]|[02468][048])))|(?=(?:[13579][26]|[02468][048])00))\d{4}(?!\d))))\/\d{4,} (?:[01]\d|2[0-3]):[0-5]\d$/


这可以简化吗?明确地!

我会这样做吗?见鬼!

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

【讨论】:

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