繁体   English   中英

更正正则表达式以匹配日期

[英]Correct Regular expressions to match a date

用于验证日期的正确正则表达式是什么? 2009-10-22或2009-01-01等。平台PHP

(来自regexplib.com )将匹配您想要的内容,并执行leap年,每月天数等检查。分隔符的容忍度超出了您的期望,但可以轻松地解决。 如您所见,这非常可怕。

另外(最好是我认为),您可能希望简单地检查正确位置的数字,然后在代码中执行leap年和每月的天数检查。 有时,一个正则表达式不是那么容易理解,并且在代码中显式执行检查会更加清晰(因为您可以准确地报告出了什么问题-“ 11月仅30天”,而不是“不匹配模式”消息,旁边没用)

如果您想做一些简单的事情,其功能不只是验证格式,还不能验证输入的月份或leap年中的多少天,则可以使用以下方法:

^(19|20)[0-9]{2}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

此示例允许年份为19xx和20xx

因为您必须处理接受2009-02-28而不是2009-02-29而是接受2008-02-28,所以您需要1认为正则表达式可以给出的更多逻辑。 (但如果有人可以证明这一点,我会印象深刻)

我会尝试将其转换为日期并报告转换是否失败,或者您使用的语言是否具有检查日期功能。

\\d{4}-\\d{2}-\\d{2}会匹配该格式的字符串,但是要检查日期是否有效,您必须将该字符串分解为年,月和日(可以使用该正则表达式)部分,并检查每个部分。

您还可以确保年份必须以1或2开头: [12]\\d{3}-\\d{2}-\\d{2} ,并且您也可以对月份和日期进行同样的操作: [12]\\d{3}-[01]\\d-[0123]\\d (但我会使用第一个正则表达式并“手动”比较部分)

在1900年至2000年之间的日期中,在网络上发现了此日期并对其进行了测试,并显示了稳定的日期:

(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])

好的,可以验证月份和日期范围的正则表达式可能是

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

如果您想限制年份,例如从1900年到2050年,您可能会得到

(?:2050|20[0-4][0-9]|19[0-9]{2})-(?:1[0-2]|[1-9])-(?:3[01]|[12][0-9]|[1-9])

他们不会赶上2月31日这样的“非常错误”的日期,因此,非常清楚的是,需要在正则表达式之外执行健全性检查。

在.NET正则表达式中:

\d{4}\-\d{2}\-\d{2}
[0-9]{4}-[0-9]{2}-[0-9]{2}

要么

\d\d\d\d-\d\d-\d\d

要么

...

只需阅读第一个regex教程

 ^\d{4}-\d{2}-\d{2}$

但没有正则表达式可以阻止某人输入“ 9867-39-56”

对于完整的验证(其中包括验证日期,月份和年份部分是否有效),Regex不是首选工具。 除了月份问题之外,您还会遇到leap年的麻烦...

因此,如果您只想检查粗略格式是否正确,或者隔离不同的部分(年月日),则可以使用正则表达式。

([0-9]{1,4})-(1[012]|0?[1-9])-([12][0-9]|3[01]|0?[1-9])

这已经很精确了,可以将年(0..9999),月和日捕获到捕获组中,以供分析...

如果您不仅可以依赖正则表达式,那么使用PHP附带的Posix函数date()和time()的混合解决方案可能如下所示:

<?php
date_default_timezone_set("GMT");

function validateDate($date)
{
    if (preg_match("^[0-9]{4}-[0-9]{2}-[0-9]{2}^", $date))
    {
        return date('Y-m-d', strtotime($date)) === $date;
    }
    return false;
}

// Some tests
$dates = array(
    '2009-09-09', '2009-09-32', '2009-31-00', '2035-01-02',
);
foreach($dates AS $date)
{
    echo $date .': '. (validateDate($date) ? 'OK' : 'FAILS') ."\n";
}
?>

它不是很优雅,而且会受到Unix Epoch时间的限制(从格林尼治标准时间1970年1月1日00:00:00到格林尼治标准时间2038年1月19日),但是它是可靠的,并且在PHP中得到了很好的支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM