آشنایی با عبارات منظم و استفاده از آنها در سوئیفت - بخش اول

آشنایی با عبارات منظم و استفاده از آنها در سوئیفت - بخش اول

مقدمه

عبارات منظم راهی برای مشخص کردن الگوهای رشته ای می باشند، به یقین با توابع جستجو و جایگزینی در ویرایشگر متن و یا IDE مورد علاقه خود آشنایی دارید. شما قادر به جستجوی کلمات و عبارات مشخص و خاص می باشید و گزینه های دیگری مانند حساسیت نسبت به بزرگ و کوچکی حروف را نیز می توانید فعال کنید، بنابراین جستجو برای کلمه color نتایج Color ،COLOR و CoLoR را نیز بر می گرداند. اما چنانچه به دنبال هجی های مختلف کلمه و در این مورد color و colour باشید، باید دو جستجوی مجزا را به انجام رسانید؟

شاید این مثال بسیار ساده بنماید، اما شرایطی را در نظر بگیرید که به دنبال هجی های مختلف نام انگلیسی Katherine می گردید و یا به طور عمومی تر مایل اید تا در یک داکیومنت تمامی رشته هایی را که مشابه اعداد هگزادسیمال، تاریخ ها، شماره تلفن ها، آدرس های ایمیل، شماره کارت های اعتباری و غیره هستند پیدا کنید.

طرح کلی

در این مطلب آموزشی مفاهیم اصلی که برای درک این مبحث مورد نیاز است شرح داده خواهد شد، بدین ترتیب شما در قالب چند مفهوم اصلی، قادر به درک 70 درصد از عملکردهای موردنیاز خود خواهید بود. 30 درصد باقی مانده نیز امکانات پیشرفته ای هستند که در آینده فرا خواهید گرفت و اگر مایل به کسب مهارت کامل در زمینه عبارات منظم هستید، بدان نیاز خواهید داشت.

سینتکس های بسیار زیاد و متعددی در ارتباط با عبارات منظم وجود دارند، اما بیشتر آنها در این مطلب گنجانده شده اند و به شما امکان حداکثر استفاده از ایده های اصلی را می دهند. آموزش این بخش ها به صورت گام به گام انجام می شود، بنابراین لزومی برای به خاطر سپردن اطلاعات زیادی وجود ندارد.

پیش از پرداختن به پیاده سازی سوئیفت، مقدمات را با استفاده از یک ابزار آنلاین بسیار کاربردی و خوب که به شما در طراحی و اعتبارسنجی عبارات منظم با کمترین تلاش یاری می رسانند، شرح خواهیم داد. زمانی که شما با ایده های اصلی آشنایی کامل پیدا کردید، تنها کار لازم درک Swift API و پیاده سازی این عبارات منظم در آن می باشد.

به یاد داشته باشید که عبارات منظم بهترین ابزار برای پردازش رشته ها می باشند و در عمل لازم است تا به دقت مواردی را که عبارات منظم در آنها عملکرد خوبی را به نمایش خواهند گذاشت شناسایی کنید. در برخی از شرایط نیز می توان بخشی از کار را با استفاده از عبارات منظم به انجام رسانده و مابقی را به منطق الگوریتمی واگذار کرد.

مفاهیم اصلی

عبارات منظم ریشه در نظریه محاسبات دارد و از جمله موضوعاتی است که توسط دانش کامپیوتری مورد مطالعه قرار گرفته، در حقیقت عبارت منظم در نقش ورودی برای یک کلاس خاص از ماشین های محاسباتی انتزاعی که "اتوماتیک محدود" نام دارند ظاهر می شوند.

با این تصور که با منطق بازگشتی آشنایی دارید، به نحوه تعریف توابع بازگشتی می پردازیم. این قیبل از توابع یک نسخه ساده تر از خود هستند که با ردیابی تعریف بازگشت آنها باید به یک مورد پایه برسید که صریحا تعریف شده است. وقتی که از رشته ها سخن به میان باشد صریحا یک مجموعه کاراکتر را در ذهن داریم برای مثال اسکی، یونیکد و غیره.

قوانین

هر کاراکتر در مجموعه به عنوان یک عبارات منظم تلقی می شود که با یک رشته مطابقت دارد. بنابراین a به عنوان یک عبارت منظم با "a" مطابقت داشته  و b نیز با رشته “b” هم خوانی دارد و یا عبارت منظم خالی یا همان Ɛ نیز با رشته "" مطابقت دارد. این نمونه ها را می توان به عنوان موارد پایه برای توابع بازگشتی به شمار آورد.

قوانین زیر به ما در جهت ساخت عبارات منظم از عبارات کنونی یاری می رسانند.

1. الحاق دو عبارت منظم یک عبارت منظم جدید است که با الحاق هر دو رشته ای که با عبارت های منظم اصلی مطابقت دارند، هم خوانی دارد.

2. تناوب دو عبارت منظم یک عبارت منظم جدید است که با یکی از عبارات منظم اصلی مطابقت دارد.

3. * یک عبارت منظم با صفر و یا تعداد بیشتری از عبارت منظم اصلی مطابقت دارد.

برای درک بهتر این مفاهیم آنها را به صورت مثال بیان می کنیم.

مثال 1

از مثال اول فهمیدیم که عبارات منظم a و b با رشته های “a” و “b” مطابقت دارند، در نتیجه ab یک عبارت منظم است که با رشته “ab” مطابقت دارد. از آنجایی که ab و c هر دو عبارت منظم هستند، abc یک عبارت منظم است که با “abc” مطابقت دارد. با همین منطق قادر به ساخت عبارات منظم طولانی دلخواه خود هستیم که با رشته ای با کاراکترهای یکسان مطابقت خواهد داشت.

مثال 2

مبنی بر قانون دوم o و a دو عبارت منظم هستند و o | a با رشته های “o” یا “a” مطابقت دارد. خط عمودی در این عبارت منظم نشان دهنده تناوب است. c و t دو عبارت منظم هستند و در صورت ترکیب با قانون اول می توانیم  عبارت  c ( o | a ) t را بسازیم که یک عبارت منظم جدید بوده و از پرانتزها برای گروه بندی استفاده شده است.

اما این عبارت منظم با چه رشته های مطابقت دارد؟ c و t که در اول و آخر عبارت ظاهر شده اند تنها با حروف خود مطابقت دارند، بدین معنا که عبارت منظم c ( o | a ) t با رشته ای هم خوانی خواهد داشت که با حرف c شروع شده، شامل یکی از حروف a یا o باشد و پس از آن نیز حرف t در رشته ظاهر شود، مثلا رشته cat و یا cot. توحه کنید که رشته coat در اینجا پذیرفته نیست و رشته باید تنها یکی از حروف o یا a را بر بر گرفته باشد، نه هر دو را.

مثال 3

از قانون سوم پیداست که عبارت منظم *a با صفر و یا تعداد بیشتری از “a” مطابقت دارد، یعنی یک رشته خالی و یا رشته های “a”، “aa”، “aaa” و غیره. اما عبارت ho*t به چه معناست؟ این عبارت با رشته های ht که حرف o  ندارد، رشته “hot”، “hoot”، “hoot” و غیره مطابقت دارد. اما عبارت( b ( o | a چطور؟ این عبارت با رشته هایی که با حرف b شروع شوند و دارای هر تعداد از حروف o یا a هستند مطابقت دارند، برای نمونه رشته های “b”، “boa”، “baa”، “bao”، “baooaoaoaoo” و غیره تنها چند مورد از رشته هایی هستند که می توان با این عبارت منظم مطابقت داد. قابل توجه است که پرانتزها برای گروه بندی کردن بخشی از عبارت منظم که * برای آنها استفاده شده، بکار برده می شود.

مثال 4

اگر بخواهید عبارت منظمی را بسازید که صدای بع بع گوسفند را تشخیص دهد که در حقیقت تکرار صدای اصلی “baa” است چه کار می کنید؟

اگر جواب شما *(baa) باشد درست فکر کرده اید، اما این عبارت منظم شامل رشته خالی نیز می شود که مورد نظر ما نیست. برای این کار لازم است تا baa را به ابتدای عبارت منظم اضافه کنید، یعنی *(baa(baa. به طور مشابه برای صدای گاو عبارت *(moo(moo مورد استفاده قرار می گیرد و عبارت *(baa (baa) * | moo (moo برای تشخیص صدای یکی از این دو حیوان مورد استفاده قرار می گیرد. چنانچه تا به اینجای کار را کاملا درک کرده اید، ادامه کار نیز برای شما آسان خواهد بود و در مطالب آینده به جزئیات عبارات منظم پرداخته می شود.

 

http://code.tutsplus.com برگرفته از

اینها را هم بخوانید