عبارات با قاعده

گاهی اوقات برای گرفتن ورودی از کاربر لازم است که آن را چک کنید که آیا از یک الگوی خاص پیروی می‌کند یا نه؟ به عنوان مثال فرض کنید که یک جعبه متن (textbox) وجود دارد و کاربران آدرس ایمیل خود را در آن وارد می‌کنند حال شما می‌خواهید چک کنید که آیا ورودی واقعاً یک ایمیل است یا نام و یا شماره تلفن.

در این مورد دات نت یک الگوی عالی برای چک کردن و دستکاری متون در اختیار شما قرار می‌دهد. فضای نامی که عبارات با قاعده در آن قرار دارند System.Text می‌باشد. عبارات با قاعده که دارای کلاس RegEx می‌باشند این کاراها را با قدرت انجام می‌دهند. مثال ساده‌ی زیر به سادگی هر چه تمام‌تر نحوه استفاده از کلاس Regex را نشان می‌دهد.

Regex myRegEx = new Regex("sample");
string s1 = "This is a sample.";

if (myRegEx.IsMatch(s1))
   Console.WriteLine("Match found!");

سازنده Regex یک پارامتر رشته‌ای قبول می‌کند که همان الگویی است که شما به دنبال آن هستید. با استفاده از متد IsMatch() می‌توان در داخل یک رشته، رشته یا رشته‌هایی را پیدا کرد که با الگوی ما مطابقت دارند. از آنجاییکه در مثال بالا الگوی ما رشته “sample” است و این رشته در رشته s1 وجود دارد در نتیجه متد IsMatch() مقدار true را بر می‌گرداند.

همچنین می‌توانید محل دقیق یک متن مثلاً “string” در مثال زیر را به دست بیاورید. برای این کار از متد Match() که یک شیء از کلاس Match که دارای خاصیت Index است استفاده می‌کنیم. این خاصیت (خاصیت Index) اندیس یا محل وقوع رشته‌ای که که با رشته مورد نظر ما مطابقت دارد را بر می‌گرداند.

Regex re = new Regex("string");
string s1 = "This is a string";
Match match = re.Match(s1);

if (match.Success)
{
   Console.WriteLine("Match found at " + match.Index);
}
Match found at 10

همچنین از متد Matches() می‌توان برای چندین رشته متناظر با یک رشته استفاده کرد. این متد یک شیء از MatchCollection بر می‌گرداند که شما به وسیله اینشی و یک حلقه محل وقوع رشته‌های متناظر را به دست آورید.

Regex re = new Regex("happy");
string s1 = "This is a happy happy happy day.";
MatchCollection matches = re.Matches(s1);

foreach(Match match in matches)
{
   Console.WriteLine("Match found at index {0}.", match.Index);
}
Match found at index 10. 
Match found at index 16. 
Match found at index 22.

کلاس Regex دارای متد استاتیک Match() می‌باشد که یک شیء از Match را بر می‌گرداند و دارای دو پارامتر است: اولین پارامتر الگویی است که به دنبال آنیم و دومین پارامتر رشته‌ای است که به دنبال الگو در آن هستیم.

Match match = Regex.Match("sample", "This is a sample.");

if (match.Success)
   Console.WriteLine("Match found!");

می‌توان با استفاده از عملگرهای عبارات با قاعده عملیات جستجوی پیچیده‌تری را هم انجام داد. فرض کنید که می‌خواهید بدانید آیا یک رشته خاص دارای رشته “Mr” یا “Mrs” می‌باشد یا نه؟ می‌توان این کار را با استفاده از عملگر | انجام داد.

string name = "Mr. John Smith";
Regex r = new Regex("Mr|Mrs");
if (r.IsMatch(name))
{
   Console.WriteLine("Match found!");
}

اینجاست که Regex رشته‌های “Mr” و “Mrs” را در داخل رشته پیدا می‌کند. اگر حداقل یکی از دو رشته در داخل رشته فوق پیدا شود متد IsMatch() مقدار true را بر می‌گرداند. در جدول زیر عملگرهای معمول عبارات باقاعده که از آنها در یافتن الگو استفاده می‌شود، ذکر شده است:

عملگر توضیح
. هر کاراکتر واحد را تطبیق می‌دهد.
[] همه کاراکترهای داخل کروشه را تطبیق می‌دهد.
[^ ] همه کاراکترها، بجز کاراکترهای داخل کروشه را تطبیق می‌دهد.
? 0 یا 1 رخداد از الگوی قبلی را تطبیق می‌دهد.
* صفر یا چند رخداد از الگوی قبلی را تطبیق می‌دهد.
+ 1 یا چند رخداد از الگوی قبلی را تطبیق می‌دهد.
{n} دقیقاً n رخداد از عنصر قبلی را تطبیق می‌دهد.
{n, } حداقل n رخداد از عنصر قبلی را تطبیق می‌دهد.
{n,N} حداقل n رخداد و حداکثر N رخداد از عنصر قبلی را تطبیق می‌دهد.
^ ابتدای خط را تطبیق می‌دهد. (یافتن کلمه یا عبارتی که در ابتدای خط آمده است)
$ انتهای خط را تطبیق می‌دهد. (یافتن کلمه یا عبارتی که در انتهای خط آمده است).
\< ابتدای یک کلمه را تطبیق می‌دهد.
\> انتهای یک کلمه را تطبیق می‌دهد.
\b ابتدا یا انتهای یک کلمه را تطبیق می‌دهد.
\B منطقه میانی یک کلمه را تطبیق می‌دهد.
\d اعداد (9-0) را تطبیق می‌دهد.
\w حروف و اعداد را تطبیق می‌دهد.
\s فضاهای خالی را تطبیق می‌دهد.

به مثال‌های بیشتری در زیر توجه کنید:

الگو نمونه تطبیق
^[A-Z][a-zA-Z]*$ John, Raymond, Allen
^[0-9]+\s+([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$ 123 Some Street
567 Unknown
\d{5} 12345

علامت ^ شروع و علامت $ پایان یک رشته را نشان می‌دهد. [A-Z] بدین معنی است که کاراکتر باید از A تا Z باشد.

از کاراکتر ^ برای خنثی کردن اثر استفاده می‌شود. به عنوان مثال اگر از [^A-Z] استفاده کنید همه کاراکترها غیر از کاراکترهای A تا Z (حروف بزرگ انگلیسی) تطبیق داده می‌شوند. معنای ساده الگوی [a-zA-Z] این است که همه حروف الفبا چه بزرگ و چه کوچک تطبیق داده شوند.

عملگر * هر تعداد از الگوی قبلی را تطبیق می‌دهد. پس الگوی [0-9]* با 1 و 12 و 123 و … تطبیق داده می‌شود.

کاراکتر؟ 0 یا 1 رخداد از الگوی قبلی را تطبیق می‌دهد. به عنوان مثال \d? با هیچ یا یکی از اعداد تطبیق داده می‌شود.

علامت +، 1 یا تعداد بیشتری از الگو را تطبیق می‌دهد. بنابراین [0-9A-Z]+ الگوهای 9، A8، 87G، 9AT2 و … را تطبیق می‌دهد.

از {n} برای تطبیق یک الگوی تکراری استفاده می‌شد. بنابراین A{5} الگوی AAAAA را تطبیق می‌دهد.

{n, } دست کم یکبار وقوع n را تطبیق می‌دهد. بنابراین B{2, } الگوهای BB، BBB، BBBB را تطبیق می‌دهد نه B را.

{n, N} حداقل و حداکثر تعداد تکرار یک الگو را تطبیق می‌دهد. بنابراین C{3, 5}، الگوهای CCC، CCCC و CCCCC را تطبیق می‌دهد نه C یا CCCCCC را.

عبارات با قاعده از قبل ساخته شده زیادی در اینترنت وجود دارد. با مراجعه به سایت http://regexlib.com می‌توانید تعداد زیادی از این عبارات را مشاهده کنید.