正则表达式 - 如何翻译?

时间:2011-04-29 16:48:43

标签: regex

你能为我翻译一下吗?我的男朋友是一名程序员,并发布了一条我根本无法理解的信息。

^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2})) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$

这是什么意思?这是带有单词的正常消息还是某种其他代码?

1 个答案:

答案 0 :(得分:7)

这是一个试图的所有有效的日期/时间匹配d/m/y H:M:S格式,有或没有前导零的表达,和使用2-位或4位年,包括年02月29上闰年。不知道为什么他会发送给你这个,除非你的谈话背景以某种方式使它相关。

匹配:

  • 一月,三月,五月,七月,八月,十月或十二月的第31天,或任何一个月,但2月,在任何一年从1600到9999的29日或30日天;
  • 2月29日,从1604年到9996年的任何四年但不是100年的任何一年,或从1600年到9600年的400多年;
  • 或1-28天,任何一年中任何一个月的1600至9999;

加上24小时格式的时间。

看起来他没有考虑闰秒。坏男孩。

编辑:

再次查看正则表达式,它看起来也不匹配29/2/00 00:00:00。闰年匹配400年的倍数并不需要考虑两位数年份。它真的不能以80年左右的时间(或00开始意味着2100而不是2000)的方式打破,除非他想将00定义为意义2000对于软件的预期寿命而言,如果它存在很长时间,则存在非常微妙的Y2.1K错误。