راهنمای رگولار اکسپرشن (Regular Expression) یا رجیکس (Regex) برای برنامه‌نویسان مبتدی


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

ریجکس ریشه در ریاضیات دارد و در علم برنامه‌نویسی هم در سال 1968 توسط Ken Thompson در ویرایشگر متن QED برای جستجوی متن به کار رفت. برخی دولوپرها با نگاه اول به مقولهٔ رجیکس، از یادگیری آن صرف نظر می‌کنند چرا که سینتکس پیچیده‌ای دارا است در حالی که با تکرار و تمرین می‌توان بر آن مسلط شد. 

در ادامه، برخی از کاربردهای رجیکس را بیان می‌کنیم اما دقت داشته باشید که در تمامی مثال‌ها از زبان جاوااسکریپت استفاده شده است (برای مشاهده جدولی حاوی نکات تکمیلی رجیکس، می‌توانید به لینک Mozilla Developer Network's Regular Expression مراجعه کنید.)

با یک مثال ساده شروع می‌کنیم. در شکل زیر، یک رجیکس را به همراه توضیحات مربوط به تمامی بخش‌های آن مشاهده می‌کنید:

 راهنمای رگولار اکسپرشن (Regular Expression) یا رجیکس (Regex) برای برنامه‌نویسان مبتدی

رجیکس بالا به دنبال پیدا کردن کاراکتر B در یک خط است که پس از آن باید حداقل یکی از کاراکترهای بین a تا z و A تا Z (و خود کاراکترهای a و b و A و B) و شماره‌های 0 تا 9 یک بار تکرار شده باشند. در ادامه، نمونه‌های تطبیق داده شده به صورت بولد نمایش داده شده‌اند:

Basket, bulb, B12 vitamin, BaSO4, N BC company

حال برای درک بهتر مفهوم رگولار اکسپرشن، کدهای زیر را مد نظر قرار می‌دهیم:

var input = "your test string", regex = /B[a-zA-Z\d]+/;
if(!regex.test(input))
    alert('No match is found');
else
    alert('A match is found');

در کد فوق، متد ()test اِسترینگ ورودی را گرفته و در صورت تطبیق با رجیکس در نظر گرفته شده، مقدار true و در غیر این صورت مقدار false را برمی‌گرداند.

همان‌طور که در ادامه مشاهده می‌شود، متد ()match اِسترینگ ورودی را گرفته و تمام تطبیق‌های رجیکس در نظر گرفته شده را برمی‌گرداند و همان‌گونه که می‌بینید، برای یافتن تمام تطبیق‌ها، مؤلفهٔ g به انتهای رجیکس اضافه شده است:

var input = "your test string", 
    regex = /B[a-zA-Z\d]+/g, 
    /*I've added the global modifier 'g' to the regex to get all the matches*/
    ary = input.match(regex);    
if(ary===null)
    alert('No match is found');
else
    alert('matches are: ' + ary.toString());

متد ()replace هم معادل‌های یافته‌شده را با علامت # جایگزین می‌کند:

var input = "your test string", 
    regex = /B[a-zA-Z\d]+/g;
alert(input.replace(regex, "#"));

تمرینات زیادی برای رجیکس وجود دارند که می‌توانید با جستجوی کلیدواژگان Regex Exercises در گوگل، آن‌ها را بیابید. از جمله سناریوهایی که رگولار اکسپرشن می‌تواند به کار آید، می‌توان به موارد زیر اشاره کرد:

- پین‌کد
- کدهای هگزادسیمال 
- تاریخ 
- ایمیل 
- اعداد اعشاری 
- جایگزینی کاراکتر انتهایی یک استرینگ 
- یافتن و جایگزینی فضاهای خالی
- جداسازی قسمت‌های مختلف یک لینک

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

Debuggex 
این ابزار یک دیاگرام رجیکسی مطابق با ورودی می‌کشد.

RegExr 
با این ابزار می‌توانید رجیکس خود را تست کنید. همچنین رفرنس‌ها، چیت‌شیت و مثال‌هایی را برای کمک به شما ارائه می‌دهد.

Refiddle
با استفاده از این ابزار می‌توانید به غیر از JS، با نسخه‌های NET. و Ruby رجیکس نیز کار کرده و کدهای خود را تست کنید.

Regexper
این ابزار اپن‌سورس برای کار با رگولار اکسپرشن و یادگیری آن عرضه شده است که برای کسب اطلاعات بیشتر، می‌توانید به مقالهٔ Regexper: ابزاری برای نمایش رجیکس به صورت گرافیکی مراجعه نمایید.

در ادامه،‌ یک راهنمای خلاصه (چیت‌شیت) برای کار با رگولار اکسپرشن آورده‌ایم که اصول کار را به خوبی شامل می‌گردد:

[abc] هر کاراکتر تکی b ،a یا c
[^abc] هر کاراکتری به غیر از کاراکترهای b ،a یا c
[a-z] کاراکترهای مابین و شامل a تا z
[^a-z] کاراکترهایی به غیر از a تا z
[A-Z] کاراکترهای مابین و شامل A تا Z
. هر کاراتری
\s هر کاراکتر وایت‌اسپیس (مانند تَب)
\S هر کاراکتری که وایت‌اسپیس نباشد
\d ارقام بین 0 تا 9
\D هر چیزی به غیر از ارقام
\w هر کاراکتر کلمه‌ای (حروف الفبا، اعداد و آندراسکور)
\W هر کاراکتر غیر کلمه‌ای
(…) تمام چیزهای داخل یک محدودهٔ خاص
(a|b) حروف a یا b
a? کاراکتر a یا وجود نداشته باشد و یا یک بار آمده باشد
a* کاراکتر a یا وجود نداشته باشد و یا دفعات زیادی تکرار شده باشد

حال نوبت به نظرات شما می‌رسد. با توجه به پیچیده‌ بودن یادگیری رجیکس، چه راه‌کاری را برای درک بهتر این موضوع پیشنهاد می‌کنید؟ نظرات، دیدگاه‌ها و تجربیات خود را با سایر کاربران سکان آکادمی به اشتراک بگذارید.