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

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

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

نخستین مثال عملی

وقتی که از تطبیق عبارت های منظم صحبت می کنیم، منظورمان دو مورد زیر می باشد:

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

2. چک کردن اینکه آیا کل رشته با عبارت منظم مطابقت دارد یا خیر.

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

blog_19923_1

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

تطبیق های حریصانه

رشته baabaa دربرگیرنده دو تطبیق است یا یکی؟ به بیان دیگر هر baa یک تطبیق حساب می شود یا baabaa به طور کل یک تطبیق است؟ این موضوع بستگی به استفاده از تطبیق حریصانه دارد، این نوع تطبیق سعی در تطبیق بیشترین تعداد رشته ممکن می نماید.

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

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

حروف بزرگ و کوچک

رشته Baabaa در تطبیق شکست می خورد و این موضوع به خاطر حرف B است، اما اگر بخواهید حرف بزرگ در ابتدای رشته را مجاز کنید از چه عبارتی استفاده خواهید کرد؟

یک جواب محتمل * (B | b) aa (baa) می باشد، یک حرف بزرگ یا کوچک از b که aa پشت سر آن می آید و پس از آن نیز صفر یا تعداد بیشتری از baa ظاهر می شود. این روش شما را به هدف می رساند اما به سرعت کارآیی خود را از دست می دهد و اگر بخواهید استفاده از حروف بزرگ را غیرمجاز کنید به مشکل بر خواهید خورد. برای مثال اگر بخواهید برای هر مورد یک جایگزین مشخص کنید نتیجه ای مشابه + ( [Bb] [Aa] [Aa] ) را مشاهده خواهید کرد.

خوشبختانه انجین های عبارت های منظم گزینه ای برای نادیده گرفتن بزرگ و کوچکی حروف را در خود جای داده است، در RegExr بر روی دکمه ای که flags را می خواند کلیک کرده و چک باکس ignore case را انتخاب نمایید. توجه داشته باشید که حرف i به فهرست گزینه ها در پایان عبارت منظم اضافه شده است. برای روشن شدن موضوع مثال هایی با ترکیبی از حروف مانند bAABaa را تست کنید.

یک مثال دیگر

در این مرحله به طراحی یک عبارت منظم که حالت های مختلف نام Katherine را می گیرد، خواهیم پرداخت. برای آنکه درک بهتری از کار پیدا کنیم تمامی حالت های این اسم را می نویسیم تا بخش های مشترک را پیدا کرده و در گام بعدی یک فرمولی برای عبارت منظم پیدا می کنیم تا تمامی حالت ها را در خود جای دهد. برای نمونه حالت های Katherine ،Katharine ،Catherine ،Kathreen ،Kathleen ،Katryn و Catrin برای این نام موجودند. با دقت در حالت های مختلف در می یابیم که موارد زیر در تمامی آنها مشترک است:

- تمامی نام ها با حرف k یا c شروع می شوند.

- بعد از آن at را مشاهده می کنیم.

- احتمالا بعد از آن حرف h می آید.

- احتمالا یک a یا e را پس از آن می بینیم.

- پس از آن حروف r یا l ظاهر می شوند.

- در ادامه حرف های i ،ee یا y می آید.

- و در آخر یک حرف n می آید.

- احتمال دارد که حرف e نیز در آخر بیاید.

هم اکنون ایده کلی برای چیدمان حروف را در ذهن داریم، حال باید عبارت منظم آن را بسازیم:

[kc]ath?[ae]?(r|l)(i|ee|y)ne?

blog_19923_2

توجه داشته باشید که KatherineKatharine دارای دو تطبیق بدون فاصله است. چنانچه آن را در ویرایشگر متن RegExr ببینید، یک فاصله در های لایت کردن دو تطبیق را مشاهده می نماید که پیش از این سخن از آن به میان آمد.

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

سینتکس ها و مثال های بیشتر

پیش از پرداختن به سوئیفت به بحث درباره جوانب بیشتری از سینتکس های عبارت های منظم می پردازیم.

نمایش های مختصر

برخی از کلاس های کاراکترهای مرتبط دارای یک نمایش اختصاری می باشند:

- w\ کاراکتر الفبایی شامل آندراسکور و معادل [ _a-zA-Z0-9] است.

- d\ نمایش دهنده یک عدد و معادل [ 0-9 ] است.

- s\ نمایش دهنده فضای خالی شامل اسپیس، تب و یا پرش خط می باشد.

این کلاس ها همچنین دارای کلاس های منفی مربوطه نیز می باشند:

- W\ نشان دهنده یک کاراکتر غیرالفبایی و غیر آندراسکور است.

- D\ یک کاراکتر غیرعددی است.

- S\ یک کاراکتر غیر از فاصله می باشد.

کلاس ها با حروف کوچک را به خاطر سپارید، کلاس های حروف بزرگ با رشته هایی مطابقت می کنند که کلاس حروف کوچک مربوطه با آنها مطابقت نمی کرد. توجه داشته باشید که می توانید این کلاس ها را در داخل براکت گذاشته و ترکیب کنید، برای مثال [ s \ S \ ] نمایش دهنده هر کاراکتر شامل پرش خط می باشد. به خاطر داشته باشید که . با هر کاراکتر به جز پرش خط مطابقت می کند.

Anchorها

^ و $ نمایش دهنده ابتدا و انتهای رشته می باشند، ممکن است بخواهید به جای تطبیق زیررشته به تطبیق با کل رشته بپردازید، $ c [ oau ] t ^ با رشته های cat ،cot و یا cut مطابقت داشته، اما با رشته های catch یا recut مطابقت نمی کند.

مرزهای کلمه

b\ نمایش دهنده مرز بین کلمات مثلا فاصله و یا نقطه گذاری و همچنین اول و آخر یک رشته می باشد. توجه داشته باشید که این مورد برای یک موقعیت از رشته استفاده می شود و نه یک کاراکتر مشخص. به مرز کلمه به عنوان یک تقسیم کننده نامرئی که کلمه را از کلمات قبل و بعد جدا می کند بنگرید. B\ نیز نمایش دهنده جاهایی غیر از مرز کلمه است. bcat\b\ در رشته های cat ،acat ،Hi,cat مطابقت دارد اما در رشته های acat یا catch خیر.

نفی

ایده نفی با استفاده از متاکاراکتر ^ در یک مجموعه کاراکتر بامعنی و خاص تر می شود و با استفاده از آن در ابتدای رشته متفاوت است، بدین معنا که برای نفی، ^ باید در مجموعه کاراکتر و دقیقا بعد از نقطه شروع بیاید. [ a ^ ] با هر کاراکتری در کنار a مطابقت می کند و [ a – z ^ ] با هر کارکتر به جز حرف کوچک مطابقت می کند.

آیا می توانید W\ را با استفاده از نفی و محدوده کاراکترها به نمایش گذارید؟ پاسخ این پرسش [ _^A-Za-z0-9] است. [ ^ a ] با چه رشته های مطابقت می کند؟ جواب پرسش کاراکترهای a یا ^ است، زیرا ^ در ابتدای مجموعه کاراکترها قرار نگرفته است و با خود کاراکتر ^ مطابقت می یابد. اما می توانیم با استفاده از \ کاربرد آن به عنوان متاکاراکتر را نادیده بگیریم:  [ a  ^ \ ].

سورها

با کاربرد * و + آشنایی داریم، این کاراکترها با رشته هایی با صفر یا بیشتر از یک رشته کاراکتر مطابقت می کنند و برای + وجود یک نمونه الزامی است. ایده تطبیق یک توکن برای چند دفعه را می توان با استفاده از } خاص تر کرد. برای نمونه { 4, 2 } به معنای دو یا چهار تطبیق از توکن قبل می باشد و  { ,2 } نشان دهنده دو یا بیشتر تطبیق و { 2 } به معنای دو تطبیق است.

جمع بندی

در این مطلب آموزشی بر روی تئوری و سینتکس عبارت های منظم متمرکز شدیم و به مثال هایی در این زمینه پرداختیم.

 

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

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