برسی Grouping ، Quantifiers و Character classes در عبارات منظم

Character classes

عبارات منظم – قسمت دوم در این مقاله به مفاهیم grouping و character classes می پردازیم. در این قسمت با ارائه مثال و دقیق شدن در جزئیات سعی می کنیم هر مفهوم را بهتر بررسی کنیم.

پیش از مطالعه این قسمت، توصیه می شود که قسمت اول این سری آموزشی را مطالعه نمایید.

به قسمت دوم از سری آموزشی دنیای شگفت انگیز عبارات منظم خوش آمدید! سفر شگفت انگیز ما در دنیای پر رمز و راز عبارات منظم همچنان ادامه دارد. در این قسمت مفاهیم grouping و character classes را کشف خواهیم کرد!

حال ببینیم character class چیست؟ یک character class چیزی جز مجموعه ای از کاراکترها در یک دسته بندی مشخص نیست. برای ایجاد character class راه های مختلفی وجود دارد که هر یک در مورد خاصی مفید می باشد و مورد استفاده قرار می گیرد.

به عنوان مثال، اگر بخواهیم کاراکتری را پیدا کنیم که قسمتی از یک کلمه است، یک \ تایپ می کنیم و بعد از آن کلمه w با حرف کوچک را استفاده می کنیم.

این character classها به عنوان short-hand character class شناخته می شوند، چرا که این ها به صورت از پیش ساخته شده در regular expression engine وجود دارند.

در زیر برخی از رایج ترین آن ها را می بینیم:

  • \w یک کاراکتر خاص را در گروه کلمات پیدا می کند (از a تا z ، ۰ تا ۹ و کاراکتر underline)
  • \b یک گروه کلمات را پیدا می کند مانند یک scope
  • \s کاراکترهای فاصله را پیدا می کند، مانند فاصله های ایجاد شده با tab، enter و space

Character classes

Character classes همچنین با استفاده از براکت های مربعی نیز ایجاد می شوند. یک مثال [a-z] می باشد که به موتور می فهماند که کاراکترهای بین a تا z که به عنوان یک بازه شناخته می شود، پیدا کند. همان طور که مشاهده می کنید با قرار دادن یک dash بین دو کاراکتر می توان یک بازه ایجاد نمود. به عنوان مثال [a-d] به موتور می گوید کاراکترهای بین a تا d را پیدا کند. همچنین می توان چندین بازه را به طور همزمان در براکت های مربعی تعریف نمود [A-Za-z] که به موتور می فهماند که کاراکترهای a تا z با حروف کوچک و بزرگ را بیابد.

Character class ها به صورت Generic هستند، به این معنی که برنامه نویسان مجبور نیستند که کلمات را دقیقا مشخص کنند، چرا که معمولا کلمات دارای غلط املایی هستند و این مورد بسیار پیش می آید. همچنین اگر این طور نبودند، عبارات منظم چندان کاربردی و قدرتمند نبودند.

همچنین این امکان را داریم که به موتور بگوییم که تمام کاراکترها را تطابق بدهد به جز یک کاراکتر خاص. یک راه برای این کار قرار دادن یک carrot بعد از براکت سمت چپ می باشد، به این ترتیب [^aeiou] که به موتور می گوید همه کاراکترها به جز حروف صدادار با حروف کوچک را پیدا کند.

همان طور که کلاس های short-handای برای تطابق کاراکترهای خاص وجود دارد، کلاس هایی نیز برای عدم تطابق آن ها وجود دارد.

  • \W همه کاراکترها را پیدا می کند به جز کاراکترهای word
  • \S همه کاراکترها به جز کاراکترهای فاصله را پیدا می کند.
  • \B همه کاراکترها به جز word boundary را پیدا می کند.

در قسمت بعدی به قابلیت گروه بندی این کلاس های کاراکتر می پردازیم تا عبارات منظم خود را به گروه های مختلف تقسیم کنیم. برای ایجاد یک گروه، فقط باید کلاس های کاراکتر یا کلمات را به تنهایی در پرانتز قرار دهیم. به طور مثال ([a-z]) یک گروه می باشد. فریم ورک .Net این امکان را به ما می دهد که هر تعداد گروه که نیاز داریم ایجاد کنیم. اگرچه پیشنهاد می شود که برای خوانایی بیشتر تا جایی که ممکن است عبارات منظم کوتاه باشند.

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

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


(ab(ade([1-3])))

 

البته شما می توانید چنین چیزی را داشته باشید:




(\b)([b-f])

 

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

  • نحوه نگارش زیر به معنی صفر تکرار یا بیشتر می باشد:
[a-s]* کاراکترهای a تا s را که صفر یا چند بار تکرار شده اند، پیدا می کند.

  • این نحوه نگارش یعنی حداقل یک تکرار داشته باشیم:
[۱۲]+ عدد ۱۲ را با یک یا چند بار تکرار پیدا می کند.

همچنین می توانیم quantifier را با {} ایجاد کنیم. [۱۴]{۱,} عدد ۱۴ را با یک یا چند تکرار پیدا می کند.

همچنین می توانیم عدد دیگری را بعد از کاما قرار دهیم، [۱۴]{۱,۳} که عدد ۱۴ را با یک یا ۳ تکرار پیدا می کند.

در مقاله بعدی، درباره هر چه بیشتر “نه” گفتن به موتور عبارات منظم که به عنوان negation(نفی، خنثی سازی) شناخته می شود بحث خواهیم کرد. اما حالا، قسمت بعدی به تمرین آنچه تا الان آموختیم می پردازیم. منتظر پاسخ تمرین ها در کامنت های شما هستیم J

تمرین ۱: با دقت به عبارت منظم زیر توجه کنید و توضیح دهید که چه کاری انجام می دهد.




([۲-۴])

 

تمرین ۲: لیستی از کلمات به شکل زیر داریم:




Feel, fail, fall, fruit, free





و یک عبارت منظم به شکل زیر داریم:





F[^r)

 

کدام کلمه با این عبارت مطابقت دارد؟

تمرین ۳: سوالات صحیح و غلط. کد زیر در C# برای استفاده از عبارات منظم معتبر(valid) است.

اگر صحیح است، این کد و عبارت داخل ” ” چه کاری انجام می دهد. راهنمایی: جستجو در msdn.microsoft.com می تواند به شما کمک کند.




Var myExpression = new Regex(@”dogs”);

 

تمرین ۴: این عبارت منظم چند بار مطابقت پیدا می کند؟ چند گروه در این عبارت وجود دارد؟




(Kevin[2,5})

 

تمرین ۵: گروه چیست و چگونه می توان ایجاد کرد؟ هدف از گروه بندی در عبارات منظم چیست؟

تمرین ۶: quantifier چیست و چرا از آن ها استفاده می کنیم؟

تمرین ۷: آیا استفاده از گروه بندی های تودرتو در عبارات منظم ایده خوبی است؟

تمرین ۸: در زیر لیستی از کلمات را داریم:


 

Dog, drink, doubt, dogma, drool, desk, disk, dubious, dozen

 

عبارت منظمی بنویسید کلماتی که حرف d دارند و بعد از آن حرف o نیامده باشد را پیدا کند.

فاطمه زکایی

فاطمه زکایی هستم. فارغ التحصیل کارشناسی مهندسی نرم افزار، مدت سه سال هست که در زمینه توسعه اپلیکیشن های تحت وب و اندروید و همچنین تولید محتوای تخصصی برنامه نویسی تحت وب و اندروید در مجموعه mspsoft در خدمت شما هستم.

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.