PDA

View Full Version : بررسی درست بودن تاریخ با استفاده از عبارات باقاعده



Developer Programmer
جمعه 15 آذر 1387, 17:54 عصر
چطور میشه در برنامه های مبتنی بر DB با استفاده از عبارات باقاعده فهمید که فرمت تاریخ ( yyyy/mm/dd ) و مقادیر سال، ماه و روز درست وارد شده اند ؟
(مثلا روز کمتر از 31، سال بیشتر از 1300 ، ماه کمتر از 12)

Mehdi Asgari
جمعه 15 آذر 1387, 19:21 عصر
فعلا این به ذهنم رسید:


\b(?'Year'(1[3-9]|2[0-9])\d{2})/(?'Month'10|11|12|0?[1-9])/(?'Day'1\d|2\d|30|31|0?[1-9])\b
اینم کدی برای تستش:



string[] dates = { "1300/01/01", "2008/12/5", "2001/13/01","1765/1/1","1299/12/31","11111/3/09"
, "1999/11/32","2000/10/6"};
Regex regex = new Regex(@"\b(?'Year'(1[3-9]|2[0-9])\d{2})/(?'Month'10|11|12|0?[1-9])/(?'Day'1\d|2\d|30|31|0?[1-9])\b");
foreach (string date in dates)
{
Match match = regex.Match(date);
if (match.Success)
Console.WriteLine("{0} is a valid date. Year = {1} Month = {2} Day = {3}",
match.Value,match.Groups["Year"].Value,match.Groups["Month"].Value,match.Groups["Day"].Value);
else
Console.WriteLine("{0} does not contain a valid date",date);
}

Developer Programmer
جمعه 15 آذر 1387, 21:20 عصر
لطفا جزئیاتش رو هم توضیح بده

\b(?'Year'(1[3-9]|2[0-9])\d{2})/(?'Month'10|11|12|0?[1-9])/(?'Day'1\d|2\d|30|31|0?[1-9])\b

Mehdi Asgari
شنبه 16 آذر 1387, 00:10 صبح
اگه کامل میخوای یاد بگیری یا Mastering Regular Expressions (http://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/1565922573) رو بخون یا کتاب آقای راد (http://barnamenevis.org/forum/showthread.php?t=120542) رو.
\b مرز کلمه رو مشخص می کنه (یعنی در این مثال رشتۀ “Today is 2008/12/2” رو قبول می کنه ، اما “2008/12/2d” رو نه. البته این اختیاره ، و می تونید برش دارید (مثلا اگه به جای input validation دارید سرچ می کنید)
هر چیزی که بین دو پرانتز قرار می گیره ، یک گروه هست. برای نام گذاری گروه ها (به جای استفاده از ایندکس) از علامت سوال + نام استفاده می کنیم. سه گروه Year ، Month و Day (و یه زیرگروه در گروه Year)
گروه Year: اول یک عدد 1 ، بعد یک رقم از 3 تا 9 ، یا این که اول یکم عدد 2 بعد یک رقم از 0 تا 9 (برای نشون دادن دو رقم اول سال ها. (البته من فکر کردم سال میلادی مد نظرته ، وگرنه قسمت 2 رو نمی ذاشتم. الان متوجه شدم که سال شمسی میخوای) ، بعد از این دو رقم نوشتم \d{2} یعنی دو رقم از اعداد (0 تا 9)
سپس یک اسلش گذاشتم (که واضحه چیه)
گروه Month: نوشتم یا 10 یا 11 یا 12 یا : "صفر یا یک رقم 0 (یعنی می تونیم صفر داشته باشیم یا می تونیم نداشته باشیم (هر چیزی که بعد از علا مت سوال بیاد ، یا اصلا در رشته نیست یا فقط یکی میتونه باشه) بعدش هم یک رقم از 1 تا 9)
گروه Day: "اول یک سپس یک رقم (0 تا 9)" یا "اول 2 بعد یک رقم (0 تا 9) یا 30 یا 31 یا "صفر یا یکی 0 ، سپس 1 تا 9"
نمی دونم از توضیحاتم تا چه حد چیز دستگیرت شد ، به هر حال برای یادگیری Regex حتما باید کتاب بخونی
اینم چند تا منبع :
http://www.regular-expressions.info/
http://en.wikipedia.org/wiki/Regular_expression
http://regexlib.com/
http://msdn.microsoft.com/en-us/library/hs600312.aspx

(من برای prototyping از این محصول (http://www.radsoftware.com.au/regexdesigner/) Rad Software استفاده می کنم. بد نیست.)

Developer Programmer
شنبه 16 آذر 1387, 12:33 عصر
مهدی جان،
اگه در رشته ای مثل 567-1234-(8888) بخوایم بگیم تکرار صفر یا یک از (8888)، چی باید بگیم؟

Mehdi Asgari
شنبه 16 آذر 1387, 12:56 عصر
متوجه سوالت نشدم.
اگه منظورت اینه که فقط عبارت (8888) صفر یا یک بار تکرار بشه:


\((8888)?\)

اما اگه منظورت اینه که کلا صفر یا یک بار "کد چهار رقمی داخل پرانتز" :


\(\d{4}?\)