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

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

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

ریجکس ریشه در علم عصب شناسی و ریاضیات دارد و در علم برنامه‌نویسی هم در سال 1968 توسط کن تامپسون در ویرایشگر متن QED برای جستجوی متن به کار رفت. در حال حاضر، ریجکس بخشی از بسیاری از زبان‌های برنامه‌نویسی مانند Perl ،Java ،PHP ،Python ،Ruby، و JavaScript است.

برای یادگیری ریجکس باید تمام کاراکترها، کلاس‌ها و روش‌های مورد استفاده در ریجکس را یاد گرفت. برای مشاهده جدولی حاوی تمام این موارد، می‌توانید به لینک 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

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

مثال ۱ از رجیکس 
متد test، استرینگ ورودی را گرفته و در صورت تطبیق با ریجکس در نظر گرفته شده، مقدار true و در غیر این صورت، مقدار false را برمی‌گرداند:

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');

مثال 2 از رجیکس 
متد 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());

مثال 3 از رجیکس 
متد replace، تطبیق‌های یافته شده را با #جایگزین می‌کند:

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

تمرینات زیادی برای ریجکس وجود دارند که می‌توانید با جستجوی عبارت Regex Exercises در گوگل، آنها را بیابید. اگر شما یک برنامه‌نویس مبتدی هستید، کافی است تا پسوردی با طول 8 تا 16 کاراکتر را که دربردارنده کاراکترهای مشخصی است، اعتبارسنجی کنید که این تمرین خوبی برای یادگیری رجیکس است. سپس یک گام فراتر رفته در سطوح پیشرفته‌تر با داده‌های دنیای واقعی سر و کار خواهید داشت که از آن جمله می‌توان به اعتبارسنجی موارد زیر اشاره کرد:
- پین‌کد،
- هگزادسیمال،
- تاریخ،
- ایمیل،
- اعداد اعشاری،
- جایگزینی صفر انتهایی،
- فضاهای خالی،
- و جداسازی قسمت‌های مختلف یک URL

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

Debuggex 
این ابزار، دیاگرام ریجکسی مطابق با ورودی شما می‌کشد و می‌توانید خروجی را مستقیماً در سایت StakOverflow به اشتراک بگذارید.

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

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

چیت‌شیت ریجکس
[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 یا وجود نداشته باشد و یا دفعات زیادی تکرار شده باشد

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