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

منتشر شده در 1398/07/21 | بازدید : 705 بار | زمان مطالعه : 10 دقیقه

رگولار اکسپرشن (Regular Expression) بخشی از یک متن را که با یک الگو مطابقت دارد پیدا می کند. فرض کنید به عنوان یک توسعه دهنده وب می خواهید متن درون یک لینک را استخراج کنید:

<a href=”http://sample.com”>متن درون لینک</a>

بسیار خوب فرض کنید که در شرایطی با این مسئله مواجه می شوید که امکان استفاده از  document.querySelector('a').innerText وجود ندارد؛ آیا راه حلی برای این مسئله به ذهن شما می رسد؟ یا فرض کنید می خواهید در یک صفحه html به دنبال تمام ایمیل ها بگردید. ممکن است در هر جایی از صفحه حتی لابه لای کدهای جاوا اسکریپت، یک ایمیل وجود داشته باشد. 

در واقع شما فقط این را می دانید که ایمیل چه الگویی دارد یا در مثال قبل شما فقط می دانید که متن درون یک تگ a به <a/> ختم می شود و پس از <... a> شروع می شود. بنابراین در چنین شرایطی باید از رگولار اکسپرشن استفاده کنیم چون فقط با دانستن الگوی چیزی که دنبال آن هستیم می توانیم تمام موارد مورد انطباق را پیدا کنیم. 

شما به عنوان توسعه دهنده وب در موارد زیادی به رگولار اکسپرشن ها نیاز پیدا خواهید کرد:

  •  اعتبارسنجی ورودی های فرم واضح ترین کاربرد آن است. شما نمی خواهید کاربران در فیلد مربوط به ایمیل هر چیزی وارد کنند؛ بلکه باید قبل از ارسال فرم یا در پردازش آن در سمت سرور ورودی ها را چک کرده و از انطباق ورودی ها با الگوهای مورد پذیرش شما اطمینان پیدا کنید.
  • پردازش متن در کاربردهایی مثل web scraping ؛ مثلا فرض کنید می خواهید یک کرالر بنویسید که در مجموعه ای از وب سایت ها برگردد و در صفحات تماس با ما اگر ایمیل یا شماره تماس پیدا کرد آن را برای شما استخراج کند. 

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

1.

در جاوا اسکریپت رگولار اکسپرشن به کمک دو اسلش رو به جلو یعنی // یا به کمک ()new RegExp ساخته می شوند و در توابعی مانند replace ، match یا test استفاده می شوند.

تعریف رگولار اکسپرشن در جاوا اسکریپت

2.

فرض کنید بخواهیم در عبارت "devtube" ببینم آیا عبارت tube وجود دارد یا خیر. یا فرض کنید میخواهیم به دنبال حروف 'd' یا 'u' باشیم یا به دنبال تمامی حروفی باشیم که در حروف الفبای انگلیسی بین 'a' تا 'j' باشند:

شروع کار با رگولار اکسپرشن در js

3.

گاهی اوقات در انتهای رگولار اکسپرشن یه flag قرار داده می شود. این فلگ رفتار رگولار اکسپرشن را تغییر می دهد. مثلا در جاوا اسکریپت flag های زیر پر کاربرد هستند: 

i = حساس به حروف بزرگ و کوچک

g = به جای پیدا کردن اولین انطباق تمام موارد منطبق با الگو را برگردان

استفاده از فلگ ها در regex

4.

استفاده از ^ در ابتدای رگولار اکسپرشن به معنای «شروع رشته» است.

استفاده از $ در انتها به معنای «پایان رشته» است.

ضمنا شما می توانید با قرار دادن گروه های منطبق در کنار هم انطباق های طولانی تر را هم تجربه کنید.


شروع و پایان در regular expression

5.

از نقطه و کاراکترهای خاص برای تطبیق با گستره ی وسیع تری از کاراکترها استفاده کنید. مثلا به جای [9-0] از d\ استفاده کنید یا برای اینکه بگویید هر کاراکتری از نقطه (wildcard) استفاده کنید.

. = تطبیق با هر کاراکتری به جز کاراکتر مربوط به خط جدید

\n= خط جدید

\d = عدد

\D= غیر از عدد

\s= اسپیس 

\S= هرچیزی به جز اسپیس

wildcard در رگولار اکسپرشن

 6.

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

* = هیچ یا بیشتر تطبیق

+= یک تطبیق یا بیشتر

{3} = دقیقا سه انطباق

{2,4}= دو، سه یا چهار انطباق

{2,}= دو انطباق یا بیشتر

?= یا هیچ یا فقط یک تطبیق


استفاده از quantifier ها

7.

از پرانتز برای گروه بندی استفاده کنید. در جاوا اسکریپت تابع match عبارت تطبیق یافته کامل را به همراه گروه ها بر میگرداند مگر اینکه از فلگ g استفاده کنید. مابین پرانتز از کاراکتر | برای بیان حالت های انطباق ممکن در هر گروه استفاده کنید:

استفده از پرانتز برای

8.
برای انطباق با کاراکترهای خاص از بک اسلش استفاده کنید. کاراکترهای خاص در جاوا اسکریپت عبارتند از : 

^ $ \ . * + ? ( ) [ ] { } |

کاراکترهای خاص در regex

9.

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

^= به معنای شروع یک رشته اگر در ابتدای رگولار اکسپرشن استفاده شود

^= برای استثنا کردن اگر در بین رگولار اکسپرشن استفاده شود


نحوه not کردن یک منطق

شما تا اینجا با اکثر تکنیک ها و مفاهیم رگولار اکسپرشن آشنا شدید و همین مقدار برای حل اکثر مسائل مرتبط با اعتبار سنجی (validation) یا پیدا کردن الگوهای مورد نظر در یک متن کافی است. معمولا خواندن رگولار اکسپرشن های بزرگ سخت و عذاب آور است. بنابراین سعی کنید برای الگوهای پرکاربرد و تکراری چرخ را ابتدا اختراع نکنید. مثلا برای اعتبارسنجی ایمیل به هیچ عنوان خودتان تلاش نکنید رگولار اکسپرشن بنویسید:

var email_regex = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

 

موفق باشید.