2011-01-22 11 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

[OK]を、これは私が今までに作られた中で最も美しい正規表現です。これは1582年以降のすべての飛躍の年であり、飛躍の導入です。それはまた、4世紀ごとに非跳躍を処理します。たとえば、1600は閏ですが、1700は4で割り切れますが、それはありません。私は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])))))$"); 

ダッシュ

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])))))$"); 

私はこれがある限り、彼らは正規表現をサポートするように、ほぼすべての言語のために働くことを愛するを使用して別のバージョン間のすべての日にこれをテストしました。間違いなく、言語固有の日付パーサを使用する方が賢明ですが、これは正規表現の力と優雅さを示していると思います。

これは、見たい場合は、Regexperのスラッシュ付きのパターンのimageです。

関連する問題