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

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

رگولار اکسپرشن مجموعه ای از کاراکترهایی است که یک الگوی تطابق را تشکیل می دهند و با استفاده از آن ها می توان تشخیص داد که آیا متن یا مجموعه کاراکترهایی مطابق با الگویی که می خواهید هست یا نه. از رگولار اکسپرشن (ریجکس) می توان برای اعتبارسنجی شماره کارت اعتباری، برای جستجوی یک الگو و یا برای جایگزینی متن با یک رشته ی دیگر استفاده کرد. زبان های زیادی از ریجکس پشتیبانی می کنند و شما می توانید با یادگیری ریجکس، آن را در بسیاری از زبان های برنامه نویسی بکار برید. برخی افراد با نگاه اول از یادگیری ریجکس صرف نظر می کنند، چرا که گرامر ریجکس پیچیده است و بیشتر از زبان Command Line، آنها را عذاب می دهد. اما تمام چیزهای جدید ترسناک هستند و در ابتدا یادگیری آنها به نظر غیر ممکن می آید. ولی بنا به گفته ی هوراتیوس، باید "آغاز کنیم، جسور باشیم و اقدام کنیم تا دانا شویم". پس با سکان آکادمی همراه باشید.

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

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

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

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

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

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

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

مثال ۱: متد 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

در سطح پیشرفته می توانید تمرینات بالا را به روش بهینه تری انجام دهید و همچنین باید توانایی انجام موارد زیر را داشته باشید:

تجزیه HTML یا XML (در دنیای واقعی زیاد انجام نمی شود چرا که استفاده از رگولار اکسپرشن برای تحلیل یک زبان نشانه گذاری مانند HTML مناسب نیست. علاوه بر این، تجزیه XML کار سختی است و برای کاربران سطح پیشرفته مناسب است.)، جایگزینی تگ ها، حذف نظرات (به جز نظرات شرطی برای مرورگر اینترنت اکسپلورر)

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

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

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

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

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