عبارت های با قاعده (regular expressions) یا به شکل خلاصه regex(رجکس)  به ما کمک می کنند که در متن دنبال یک سری عبارت ها یا کاراکتر هایی بگردیم که الگوی خاصی دارند.

مثلا همه می دانیم که همه شماره  موبایل ها در ایران  11 رقمی هستند(با پیش شماره) مثلا 09351234567 همه هم یک الگوی مشخص دارند. با صفر شروع می شوند، بعد 3 رم پیش شماره دارند بعد هم 7 رقم شماره دیگر.

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

عبارت های باقاعده به هیچ زبان برنامه نویسی وابسته نیستند و هر جایی می توان از آن ها استفاده کرد. البته در استفاده از آنها در بعضی زبان ها شاید یک سری اختلاف جزئی وجود داشته باشد. اما در کل خیلی تفاوتی ندارند.

من در vscode یک سری نوشته فارسی و  انگلیسی نوشته ام تا روی آن ها این رجکس را تمرین کنم.

فرقی نمی کند در جه ویرایشگری می نویسید مهم هم نیست که فرمت فایل چیست فقط یک جایی باشد که بشود نوشت و قایلیت find & replace هم داشته باشد.

regular expressions

 

برای شروع ctrl + H را بزنید تا بخش find replace نشان داده شود.

سمت راست این پنجره یک دکمه به شکل ستاره وجود دارد روی آن که کلیک کنید با این کار در قسمت find می شود از رجکس استفاده کرد.

regular expressions

یک سری رجکس ها پایه ای هستند و ابتدا باید با اینها آشنا شوید.

ساده ترین عبارت منطقی نقطه است. در این حالت اگر . را در find بنویسید همه متن انتخاب می شود.  به عبارت دیگر اگر دنبال همه متن می گردید از . استفاده کنید.

regex

 

 

d\ : همه اعداد از 0 تا 9 را انتخاب می کند.

\d

regex

 

D\ : هرچیزی غیر از اعداد را در نظر می گیرد.

\D

regex

 

w\ : هر واژه ای چه عدد چه غیر عدد را انتخاب می کند همینطور(underline) _ را.

\w

 

W\ : هر کاراکتری که در رجکس قبلی نبود را در بر میگیرد مثل فاصله ها یا کاراکترها خط فاصله * و غیره.

\W

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

 

s\ : تمام اسپیس ها را انتخاب می کند.

\s

 

S\ : هر چیزی که اسپیس نیست انتخاب می شود.

\S

 

b\ : مرز کلمات word boundary

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

اگر هم بعد از این یک کلمه یا کاراکتری بگذاریم همین نتیجه را فقط برای آن کاراکتر نشان می دهد مثلا:

\breza

regex

تمام بخش هایی که reza  از کلمه بعدی یا قبلی جدا شده را انتخاب می کند.

B\ : بر عکس قبلی عمل می کند هر جا که مرز جدایی کاراکتر نباشد را نمایش می دهد.

B\

 

^ : این کاراکتر وقتی به کار می آید که می خواهdم یک کلمه یا کاراکتری را پیدا کنیم که حتما در ابتدای یک متن به کار رفته باشد مثلا:

^reza

جاهایی که reza در ابتدای خط نوشته شده است را جدا میکند.

 

$ : بر عکس بالایی است. هر جا کلمه ای را که در انتهای خط استفاده شده باشد انتخاب می کند.

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

reza$

 

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

 

می دانیم که هر شماره موبایلی دو حرف اولش 09 است پس اولین قدم همین است. یعنی عبارت هایی را پیدا کنیم که ابتدای آنها 09 است.

پس همینطور که در کد های بالا دیدیم می توانیم بنویسیم:

^09

هر جا درنوشته ای ابتدایش 09 داشته باشد انتخاب می شود.

regex

تا اینجا ما دو رقم اول را که نشان دهنده این است که یک شماره تلفن داریم انتخاب کرده ایم.

حالا باید کاری کنیم که 9 عدد بعدی هم انتخاب شوند.

d\ برای انتخاب عدد بود اما اگر فقط همین را بعد از رجکس قبلی بنویسیم فقط یک رقم انتخاب می شود.

regex

برای اینکه تعیین کنیم 9 رقم بعد هم انتخاب شود باید به این شکل دستور را بنویسیم

^09\d{9}

 

{9} تعیین میکند که چند عدد باید انتخاب شوند.

این رجکس الان درست کار می کند و هر شماره موبایل ایرانی را که به شکل استاندارد بنویسید می شناسد اما یک اشکال دارد. اگر به جای 11  اشتباها 12 رقم یا بیشتر نوشته شده بود بازهم 11 رقم اول انتخاب می شود برای همین یک عبارت $ که نشان دهنده پایان یافتن عبارت است باید به رجکس اضافه شود.

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

^09\d{9}$

 

فکر کنم تا به اینجا کم کم روند نوشتن یک رجکس مشخص شده است.

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

 

وبسایت regex101 برای تست کردن عبارت های با قاعده مناسب است.

در این سایت هر عبارتی که میخواهید را روی هر متنی می توانید امتحان کنید. همزمان هر رجکسی که بنویسید در سمت راست یک بخشی دارد که در مورد آن توضیح می دهد.

در ادامه عملگر های دیگر که در کاربردی هستند ذکر می کنم:

شمارشگرها (quantifiers):

:

اینجا ab انتخاب می شود به علاوه هر چندتا c در دنباله آن. حتی اگر c هم نداشته باشد باز هم ab انتخاب می شود. 

abc*

 

regex

 

:

ab انتخاب می شود به همراه هر تعداد c  در دنباله آن.

abc+

regex

 

:

ab انتخاب می شود اگر هیچ یا یک c در ادامه آن بیاید.

abc?

regex

 

{} :

جایی که ab به همراه 3 تا c درادامه آن باشد.

abc{3}

 

 

regex

در این مثال هر جا بعد از ab از 1 تا 3 عدد c آمده باشد انتخاب می شود.

abc{1,3}

 

عمبگر های or :

[]

|

هر دوتای اینها یک کار انجام می دهند

در این مثال هر جا a به همراه  b یا c باشد انتخاب می شود.

a[bc]
a(b|c)

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

این مقاله از سایت مدیوم چند تا از پر کاربردترین ها را نوشته است.