2
RX的ValiDate ISO 8601
挑战 查找最短的正则表达式 只会验证,即比赛中,每一个可能的日期在Proleptic公历(这也适用于所有日期在1582年首次执行前) 与任何无效日期都不匹配。 输出量 因此,输出是真实的还是错误的。 输入值 输入采用3种扩展的ISO 8601日期格式中的任何一种-无时间。 前两个是±YYYY-MM-DD(年,月,日)和±YYYY-DDD(年,日)。the日都需要特殊的外壳。这些扩展的RX天真地将它们分别匹配: (?<year>[+-]?\d{4,})-(?<month>\d\d)-(?<day>\d\d) (?<year>[+-]?\d{4,})-(?<doy>\d{3}) 第三种输入格式是±YYYY-wWW-D(年,周,日)。由于leap周模式复杂,因此比较复杂。 (?<year>-?\d{4,})-W(?<week>\d\d)-(?<dow>\d) 对这三个组合进行的基本但有效性不足的检查如下所示: [+-]?\d{4,}-((0\d|1[0-2])-([0-2]\d|3[01]) ↩ |([0-2]\d\d|3[0-5]\d|36[0-6]) ↩ |(W([0-4]\d|5[0-3])-[1-7])) 条件 一个闰年的Proleptic公历包含闰日 …-02-29,因此它是长366天,因此…-366存在。在序数可被4整除的任何年份中都会发生这种情况,除非它也能被400整除,否则不会被100整除。 该日历中存在零年,并且是a年。 一个漫长的一年,在ISO周历包含了第53周,其中一个可以称之为一个“ 闰周 ”。在1月1日是星期四的所有年份中都会发生这种情况,在所有leap年都是星期三的所有leap年都发生这种情况。事实证明,它通常每5或6年出现一次,呈看似不规则的模式。 一年至少有4位数字。不必支持位数超过10的年份,因为这已经足够接近宇宙的年龄(大约140亿年)。前导加号是可选的,尽管实际标准建议多于4位数字的年份需要使用它。 不得接受不完整的部分或截短日期。 日期标记,例如一个月的部分,也没有必须由可能被引用的一组相匹配。 规则 这是代码高尔夫球。没有执行代码的最短正则表达式将获胜。更新:您可以使用诸如递归和平衡组之类的功能,但是会被罚款10倍,然后与字符数相乘!现在,这与Hard code golf中的规则不同:Regex可除以7。较早的答案胜出。 测试用例 有效测试 2015-08-10 2015-10-08 12015-08-10 -2015-08-10 +2015-08-10 0015-08-10 1582-10-10 2015-02-28 2016-02-29 2000-02-29 0000-02-29 -2000-02-29 -2016-02-29 200000-02-29 …