2011-01-22 432 views

回答

15

正則表達式是不適合這個任務。例如,編寫一個與有效日期「20080229」相匹配而不是無效日期「20100229」的正則表達式很難。

取而代之,您應該使用DateTime.TryParseExact,格式字符串爲"yyyyMMdd"。以下是一個示例:

string s = "20100229"; 
DateTime result; 
if (!DateTime.TryParseExact(
    s, 
    "yyyyMMdd", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.AssumeUniversal, 
    out result)) 
{ 
    Console.WriteLine("Invalid date entered."); 
}; 
2

考慮使用DateTime.TryParseExact來驗證日期。 您可以使用該方法同時驗證並讀取DateTime值。

例如:

DateTime dateValue; 
if (DateTime.TryParseExact(dateString, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue)) 
{ 
//Parsed Successfully 
} 
7

好吧,這是最漂亮的正則表達式我曾經構建過。這佔了1582年以來的所有閏年,引入了飛躍。它每四個世紀也處理非飛躍。例如,1600是飛躍,但1700不是,但它可以被四整除。我使用破折號

var yyyyDashMmDashDd = new RegExp("^(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))-(?:(?:(?:09|04|06|11)-(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)-(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02-(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}-(?:(?:(?:09|04|06|11)-(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)-(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02-(?:[01][0-9]|2[0-8])))))$"); 

我愛這適用於幾乎所有的語言,只要他們支持正則表達式1582和9999

var yyyymmdd = new RegExp("^(?:(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8])))))$"); 

另一個版本之間測試了所有日子。儘管使用語言特定的日期解析器更合理,但我認爲這顯示了正則表達式的強大和優雅。

這是一個image與Regexper斜槓模式,如果你想看到它。