簡體   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