آشنایی با Regex یا عبارت های منظم و Wildcard و شیوه ی استفاده از آن در برنامه نویسی

آنچه در این صفحه می خوانید:

  • عبارت های منظم (Regex) چیست؟
  • کاربرد عبارت های منظم (Regex)
  • عبارت های منظم (Regex) در پایتون
  • عبارت های منظم (Regex) در سی شارپ
  • عبارت های منظم (Regex) در جاوااسکریپت
  • عبارت های منظم (Regex) در جاوا

عبارت های منظم (Regex) چیست؟

یک عبارت منظم، regex یا regexp (گاهی اوقات یک عبارت منطقی خوانده می شود) دنباله ای از شخصیت هایی است که الگوی جستجو را تعریف می کنند. معمولاً چنین الگویی با الگوریتم های جستجوی رشته برای عملیات “find” یا “find and جایگزین” روی رشته ها یا برای اعتبار سنجی ورودی استفاده می شود. این تکنیکی است که در علوم نظری رایانه و نظریه زبان رسمی توسعه یافته است.

این مفهوم در دهه 1950 پدید آمد که ریاضیدان آمریکایی استفن کول کلین توضیحات یک زبان معمولی را رسماً رسمیت داد. این مفهوم با استفاده از ابزارهای پردازش متن یونیکس متداول شد. نحوهای مختلفی برای نوشتن عبارات منظم از دهه 1980 وجود داشته است که یکی از آنها استاندارد POSIX و دیگری با استفاده گسترده از آن، نحو Perl است.

عبارات منظم در موتورهای جستجو مورد استفاده قرار می گیرند، دیالوگ های پردازشگرها و ویرایشگرهای متن، در ابزارهای پردازش متن مانند sed و AWK و در تحلیل واژگانی را جستجو و جایگزین می کنند. بسیاری از زبان های برنامه نویسی قابلیت های regex را چه در داخل کتابخانه و چه از طریق کتابخانه ارائه می دهند.

regular expression به اختصار regex با معنای عبارت باقاعده، یک رشته از متن است که به شما امکان می دهد الگوهایی را ایجاد کنید که به آنها کمک بتوانید تا متناسب با تطابق، جایگذاری و مدیریت متن را انجام دهید. اگر با متن سروکار و نیاز به تجزیه مقدار زیادی از داده ها را دارید، تسلط بر عبارت باقاعده می تواند در زمان صرفه جویی کند. عبارت باقاعده متشکل از حروف و علامت های است که برای جستجو و مقایسه ی رشته ها کاربرد دارد. حدودا همه ی زبان های برنامه نویسی از  regex  پشتیبانی می کنند و استفاده از آن ها می تواند حجم کدنویسی را تا حدودی کاهش دهد. از عبارت با قاعده به منظور جستجوی عبارات در متن و جستجو و جایگزاری عبارت در متن بهره می گیریم.

کاربرد عبارت های منظم (Regex)

دنباله ای از نمادها و کاراکترهایی که رشته یا الگویی را برای جستجو در یک متن طولانی تر جستجو می کنند. یک عبارت منظم یک الگوی متنی است که از ترکیبی از شخصیت های الفبایی و کاراکترهای خاص معروف به metacharakter تشکیل شده است. در حقیقت یک نزدیک در حقیقت عبارت wildcard است که اغلب در مدیریت پرونده استفاده می شود. این الگوی برای مطابقت با رشته های متن استفاده می شود. نتیجه یک مسابقه موفقیت آمیز است یا خیر، با این حال، اگر یک مسابقه موفقیت آمیز باشد، همه الگوی ها نباید مطابقت داشته باشند، این بعداً در مقاله توضیح داده می شود.

خواهید فهمید که عبارات منظم به سه روش مختلف استفاده می شوند: متن معمولی، جستجوی و جایگزینی و تقسیم. حالت دوم در اصل برابر است با مسابقه معکوس یعنی هر چیزی که بیان معمولی مطابقت ندارد.

اصطلاحات منظم معمولاً معمولاً regexes یا RE نامیده می شوند، اما برای قوام، من با نام کامل آن به آن اشاره خواهم کرد. به دلیل تطبیق پذیری عبارت منظم، از آن در پردازش متن و تجزیه بسیار استفاده می شود. کاربران یونیکس احتمالاً از طریق استفاده از برنامه ها، grep، sed، awk و ed با آنها آشنا هستند. ویرایشگرهای متنی مانند (X) Emacs و vi نیز از آنها به شدت استفاده می کنند. احتمالاً شناخته شده ترین کاربرد عبارات معمولی در زبان برنامه نویسی Perl است. متوجه می شوید که پرل پیشرفته ترین اجرای منظم بیان تا به امروز است.

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

عبارت های منظم (Regex) در پایتون

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

ماژول پایتون از عبارات منظم پرل مانند در پایتون پشتیبانی کامل می کند. اگر خطایی هنگام تدوین یا استفاده از یک عبارت معمولی رخ دهد، ماژول re re.error استثنا را افزایش می دهد. ما دو کارکرد مهم را پوشش می دهیم، که می توانند برای بیان عادی استفاده شوند. اما یک چیز کوچک در ابتدا: شخصیت های مختلفی وجود دارند که وقتی از آنها در بیان معمولی استفاده می شوند معنای ویژه ای دارند. برای جلوگیری از هرگونه سردرگمی هنگام مواجهه با عبارات منظم، از Raw Strings به عنوان r’expression استفاده می کنیم.

پایتون یک بسته داخلی به نام re دارد که می تواند برای کار با Regular Expressions استفاده شود.

وارد کردن ماژول مجدد:

import re

عبارت های منظم (Regex) در سی شارپ

سی شارپ از عبارات منظم از طریق کلاس در فضای نامی System.Text.RegularExpressions در چارچوب استاندارد NET پشتیبانی می کند. در حالی که تفاوتهایی در ویژگیهای پیشرفته پشتیبانی شده از کتابخانه عبارت منظم .NET در مقایسه با PCRE وجود دارد، هر دو بخش عمده ای از نحو را به اشتراک می گذارند و از الگوهای و عبارات می توان در زبانهای C # و سایر زبانها استفاده کرد.

در مثال های زیر، اگر می خواهید کد را وارد کنید، نامهای زیر را در بالای فایل منبع وارد کنید:

using System.Text.RegularExpressions;

عبارت های منظم (Regex) در جاوااسکریپت

در جاوااسکریپت، یک عبارت معمولی به سادگی نوعی شیء است که برای مطابقت با ترکیب کاراکترها در رشته ها استفاده می شود.

دو روش برای ایجاد یک عبارت منظم وجود دارد:

عبارت منظم Literal – در این روش از slashes (/) برای محصور کردن الگوی Regex استفاده می شود:

var regexLiteral = /cat/;

سازنده عبارت منظم – این روش بیان را برای شما ایجاد می کند:

var regexConstructor = new RegExp(“cat”);

عبارت های منظم (Regex) در جاوا

عبارات منظم یک “زبان” ویژه برای نشان دادن الگوهای است که می خواهیم با رشته ها مطابقت داشته باشد. در صورت استفاده مناسب، آنها یک ویژگی بسیار قدرتمند جاوا و سایر زبان های برنامه نویسی هستند. با استفاده از API برای بیان مرتب جاوا، ما می توانیم کارهایی مانند موارد زیر را فقط در یک یا دو خط کد انجام دهیم:

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

همچنین اجتناب از خطوط گسترده کد، استفاده از عبارت معمولی API برای انجام این کارها همچنین می تواند بهینه سازی کارایی را برای ما به ارمغان بیاورد که احتمالاً در نظر نگرفته ایم اگر بخواهیم کد معادل آن را از ابتدا بنویسیم. همانطور که خواهیم دید، این موجزاری گاهی به قیمت خوانایی حاصل می شود. بنابراین بسیاری از برنامه نویسان با عبارات عادی رابطه عشق و نفرت دارند!

برای نشان دادن مزایا و مضرات استفاده از عبارات منظم، با یک مثال ساده شروع می کنیم.

تطبیق الگوی مثال: متن کد شده در مقابل عبارات معمولی

فرض کنید می خواهید به این سوال پاسخ دهید: آیا یک رشته داده شده شامل یک سری 10 رقمی است؟ می توانید این را کدگذاری کنید: از طریق کاراکترهای رشته تا زمانی که به رقمی ضربه بزنید چرخش کنید. سپس وقتی رقمی پیدا کردید، بررسی کنید که نه شخصیت بعدی رقم هستند. بنابراین در جاوا، کد چیزی شبیه به این است:

public boolean hasTenDigits(String s) {
int noDigitsInARow = 0;
for (int len = s.length(), i = 0; i < len; i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
if (++noDigitsInARow == 10) {
return true;
}
} else {
noDigitsInARow = 0;
}
}
return false;
}

نظرتون درباره این نوشته چیه؟ عالیه بد نیست خوب نبود

در برنامه نویسی به زبان های مختلف برای یافتن بخش هایی از متن که الگوی خاصی دارد، از عبارت های منظم یا به اختصار Regex استفاده می شود. ممکن است در برنامه نویسی یک اپلیکیشن یا بازی و یا سایت، برای جایگزین کردن بخش هایی از متن، تأیید ورودی، تغییر فرمت متن و بسیاری امور دیگر از Regex استفاده شود. البته کاربرد ریجکس به برنامه نویسی محدود نمی شود بلکه در برخی نرم افزارهای ویرایش متن هم امکان استفاده از عبارت های منظم به منظور جستجو یا جستجو و جایگزین کردن برخی عبارت ها وجود دارد.

در این مقاله با مفهوم عبارت های منظم و شیوه ی استفاده از آن آشنا می شویم. این موضوع حتی برای کاربران یا برنامه نویسان مبتدی نیز مفید است. ما را در ادامه ی مطلب همراهی کنید.

عبارت منظم یا Regex چه کاربردی دارد؟

فرض کنید که یک فایل متنی طولانی دارید و می خواهید در آن کلمه ی Ali Reza را پیدا کرده و به جای آن Alireza را جایگزین کنید. کافی در نرم افزاری نظیر Notepad++ کلید میانبر Ctrl + F را برای سرچ کردن متن فشار دهید و در پنجره ی جستجو، سراغ تب Search and Replace یا جستجو و جایگزی کردن بروید. سپس عبارت موردنظر و جایگزین آن را تایپ کنید.

اما به مثال دوم توجه کنید:

فرض کنید در فایل متنی نام خویش را به شکل های مختلفی و به صورت اشتباه تایپ کرده اید:

  • AliReza
  • Ali-Reza
  • Ali Reza
  • Ali   Reza
  • Ali- -Reza
  • Ali2Reza
  • AlirReza

و می خواهید همه ی حالت ها را با کلمه ی درست جایگزین کنید. اولین راهی که به ذهن هر کاربری می رسد، چند بار استفاده از ابزار جستجو و جایگزینی است. کار وقت گیری است! راهکاری که یک برنامه نویس یا کاربر آشنا به ریجکس پیشنهاد می کند، استفاده از عبارت منظمی است که همه ی حالت های فوق را پوشش بدهد. به عنوان مثال عبارت منظم زیر معادل این است که بین کلمه ی Ali و Reza یک یا چند کاراکتر دلخواه وجود دارد که دقیقاً برایمان مشخص نیست:

Ali(.+)Reza

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

آشنایی با تطبیق عبارت ها به کمک Regex

منظور از عبارت منظم یا Regular Expression که به اختصار Regex گفته می شود، الگویی است که به موتور پردازش Regex داده می شود تا عبارت های منطبق با آن را شناسایی کند و در ادامه فرآیندی مثل تأیید ورودی ، جایگزین کردن متن، استخراج بخش هایی از ورودی برای پردازش های بعدی و غیره انجام شود. در مثالی که زدیم، هدف سرچ کردن و جایگزین کردن بود اما کاربردهای متنوعی وجود دارد.

سینتکس استفاده از عبارت های منظم در نرم افزارها و برنامه نویسی به زبان های مختلف، گاهی به نظر بسیار پیچیده و به هم ریخته است به طوری که کاربر از فراگیری آن منصرف می شود. نمونه ی زیر یک ریجکس عمومی برای تأیید کردن آدرس ایمیل است:

(?:[a-z0-9!#$%&’*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&’*+/=?^_`{|}~-]+)*|”(?:[\x01-\ x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*”) @(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(? :(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0- 9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]| \\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

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

در توضیح عبارت های منظم سایت ها و نرم افزارهای زیادی طراحی شده و بعضاً مراحل پردازش یک عبارت منظم را با فلوچارت و نمودارهای ساده به تصویر می کشند.

اما در نهایت درک کردن مفهوم عبارت های منظم طولانی، در شروع کار ساده نخواهد بود.

استفاده از سایت های Regex Debugger

برای بررسی ریجکس های طولانی بهتر است از ابزارهای آنلاین استفاده شود مگر آنکه بسیار ماهر و سریع باشید. می توانید در برخی سایت ها نظیر Regex101 یا RegExr، عبارت منظم را وارد کنید و متنی را برای یافتن بخش هایی که منطبق بر الگو است، وارد کنید. در این سایت ها بخش های مختلف رنگارنگ می شود و درک کردن مفهوم یک عبارت منظم پیچیده، ساده تر می شود. به علاوه اشاره ای مختصر به سینتکس ها شده که برای مبتدیان مفید است.

ریجکس چطور کار می کند؟

به یک مثال ساده می پردازیم که تأیید کردن آدرس ایمیل است، البته نه مثل نمونه ی کاملی که اشاره کردیم. یک آدرس ایمیل معمولی به چند بخش تقسیم می شود:

  • یک یا چند حرف
  • نماد @
  • پس از آن یک یا چند حرف که نام دامنه است
  • کاراکتر . یا نقطه
  • و در نهایت پسوند دامنه

عبارت منظم برای این ساختار ساده، عبارت زیر است:

(.+)@(.+\..+)

این ساختار در تصویر زیر به شکل گرافیکی نیز توصیف شده است:

اما توضیحی در مورد نحوه ی پردازش ریجکس فوق: موتور ریجکس از سمت چپ آغاز می کند و گروه ها را یکی یکی تطبیق می دهد. گروه اول در این ریجکس، نام کاربری است که قبل از نماد @ ذکر می شود. عبارت زیر در ابتدای ریجکس، نام کاربری را تعریف می کند:

(.+)

پرانتز شروع و پایان برای مشخص کردن گروه اول به کار رفته و به موتور پردازش ریجکس می گوید که مقدار این گروه را در یک متغیر ذخیره کند. ممکن است برنامه نویس بخواهد در ادامه ی برنامه، از گروه اول برای کار خاصی استفاده کند.

حال اگر یک آدرس فرضی ایمیل به برنامه ای که این ریجکس در آن به کار رفته بدهید، بخش قبل از @ همان گروه اول خواهد بود که در متغیر اول ذخیره می شود. به عنوان مثال در مورد آدرس ایمیل زیر:

%$#^&%*#%$#^@gmail.com

اولین گروه عبارت %$#^&%*#%$#^ خواهد بود.

اما توضیح بیشتر در مورد مفهوم دو سینتکس + و . در گروه اول:

  • نماد + به معنی تطبیق با کاراکتر یا گروه قبل از آن به تعداد 1 مرتبه یا بیشتر است.
  • سینتکس . معادل یک کاراکتر که هر کاراکتری می تواند باشد، البته به جز خط جدید 

لذا عبارت .+ به معنی یک کاراکتر یا بیشتر است. اگر از + استفاده نمی شد، گروه اول تنها با اولین کاراکتر از نام ایمیل تطبیق پیدا می کرد.

حال سراغ ادامه ی ریجکس مثالمان می رویم. پس از نماد @، یک گروه دیگر وجود دارد:

(.+)@(.+\..+)

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

بنابراین مفهوم عبارت زیر، همان نقطه ی معمولی است:

\.

در حالی که عبارت زیر معادل یک کاراکتر دلخواه به جز خط جدید است:

.

و این دو کاملاً متفاوت هستند.

معرفی کاراکترها در عبارت های منظم

اگر در عبارت منظم از کاراکترهای غیرکنترلی استفاده شده باشد، موتور پردازش ریجکس فرض می کند که کاراکترهای ذکر شده، بلوکی است که باید تطبیق داده شود. به عنوان مثال ریجکس زیر:

he+llo

با کلمات hello و heello و heeello و هر تعدادی e در میان کلمه ی hello تطبیق دارد چرا که پس از e از + استفاده شده است. لذا کلمه ی hello با یک یا هر تعداد e مطابق با ریجکس فوق خواهد بود.

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

  • \w معادل هر کلمه ای حاوی حروف و ارقام است.
  • \d معادل هر عددی است.
  • \b معادل کاراکترهای فاصله گذاری نظیر اسپیس و تب و خط جدید است.

این سه کلاس کاراکتر در صورت نوشته شدن با حرف بزرگ، عمل عکس انجام می دهند. به عنوان مثال D به معنی هر چیزی به جز عدد است!

می توانید عبارتی که با مجموعه ای از حروف یا اعداد تطبیق دارد را نیز پیدا کنید. به عنوان مثال عبارت زیر با کاراکتری که a یا b  یا c  باشد، تطبیق پیدا می کند:

[abc]

می توانید به جای ذکر کردن همه ی کاراکترها، محدوده ای را ذکر کنید. عبارت زیر معادل عبارت فوق است:

[a-c]

و عبارت زیر معادل اعداد 1 و 2 و 3 و … الی 8 است:

[1-8]

حالت معکوس نیز با نماد ^ قابل تعریف کردن است. به عنوان مثال عبارت زیر معادل هر کاراکتری به جز حرف a الی c است:

[^a-c]

شمارنده ها در ریجکس

بخش مهم دیگری از سینتکس عبارت های منظم، شمارنده ها است. قبلاً به + اشاره کردیم که شمارنده ای به معنی 1 یا بیشتر است. به عنوان مثال عبارت زیر با هر رشته ای حاوی حروف و اعداد که بیش از یک کاراکتر داشته باشد، تطبیق پیدا می کند:

\w+

و اما چند اپراتور شمارنده ی دیگر در عبارت های منظم:

  • * به معنی صفر یا بیش از صفر مورد است. در واقع * مشابه + است با این تفاوت که حالت 0 تطبیق را نیز شامل می شود.
  • ? به معنی صفر یا یک مورد است. به عبارت دیگر وجود کاراکتر قبل از آن در متن را اختیاری می کند. یا کاراکتر پیدا می شود و یا وجود ندارد. اگر چند بار وجود داشته باشد، فقط مورد اول تطبیق داده می شود.
  • عدد داخل گیومه نظیر {4} به معنی 4 بار تکرار شدن کاراکتر قبل از آن است.
  • مجموعه اعداد یا محدوده ی اعداد داخل گیومه نظیر {1-3} به معنی حداقل و حداکثر تعداد کاراکتر است. این مثال خاص به معنی وجود 1 الی 3 مورد است.
  • اگر داخل گیومه عدد دوم را وارد نکنید، حداکثر تعداد نامحدود خواهد شد. به عنوان مثال {1,} به معنی وجود یک مورد یا بیشتر است و دقیقاً با شماره ی + که به آن اشاره کردیم، یکسان است.

محدودکننده ها

همان طور که اشاره کردیم اپراتورهای + و *، برای تطبیق کاراکتر یا گروه با حداقل یک و صفر مورد به کار می روند اما حداکثر تعداد تطبیق، نامحدود است. ممکن است نامحدود بودن تطبیق ها مشکل ساز باشد. لذا به اپراتورهای محدودکننده نیاز داریم.

به عنوان مثال فرض کنید در کد HTML یک صفحه ی وب، عبارت زیر موجود است:

<div>Hello World</div>

و می خواهید اولین تگ div  را با نوشتن جاوااسکریپت ساده ای، تغییر بدهید و کلاس یا آی تی به آن اضافه کنید. اگر از عبارت منظم زیر برای تطبیق با <div> ابتدایی استفاده کنید، با مشکل روبرو می شوید:

<(.*)>

در واقع گروه اول موجود در ریجکس فوق که .* است، با عبارت div>Hello World</div> تطبیق پیدا می کند. علت بروز مشکل، نامحدود بودن تطبیق ها در صورت استفاده از اپراتور * است.

اما چاره چیست؟ می بایست از اپراتور محدودکننده ? استفاده کنید. در این صورت به محض یافتن اولین تطبیق، کار متوقف می شود. لذا در صورت استفاده از ریجکس زیر:

<(.*?)>

گروه اول عبارت div خواهد بود. نکته ی جالب این است که می توانید اپراتور محدودکننده ? را پس از شمارنده های دیگر نیز استفاده کنید. به عنوان مثال می توانید از +? یا {0,3}? و حتی ?? استفاده کنید که البته مورد آخر اثر خاصی ندارد چرا که به هر حال صفر یا یک مورد تطبیق شناسایی می شود.

گروه ها در Regex

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

ba(na)+

این ریجکس با هر عبارتی که با ba شروع شود و به دنبال آن یک یا تعداد نامحدودی na وجود داشته باشد، تطبیق پیدا می کند. لذا bananana و banana الگویی مطابق با ریجکس فوق دارد.

به این نوع گروه که با پرانتز ساده ی شروع و خاتمه پیدا می کند، Capture Group گفته می شود و می توانید از آن در خروجی استفاده کنید.

اگر در خروجی به گروه نیاز ندارید، می توانید گروه آزاد تعریف کنید. به مثال زیر توجه کنید:

ba(?:na)

در این حالت هم na یک گروه است اما با وجود علامت سوال قبل از آن، یک گروه غیراستاندارد است.

می توانید گروه ها را نام گذاری کنید و در ادامه ی ریجکس از گروهی که قبلاً نام گذاری کرده اید استفاده کنید:

(?’group’)

برای ارجاع دادن به گروه هایی که نام گذاری نشده اند، می بایست از اعداد 1 الی 7 به شکل \1 الی \7 استفاده کنید اما برای تعداد بیشتر می بایست از روش نام گذاری استفاده کنید.

سینتکس ارجاع به گروه هایی که نام گذاری شده اند به صورت زیر است:

\k{group}

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

تفاوت بین موتورهای ریجکس

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

به عنوان مثال در ورژنی از sed که برای macOS و FreeBSD کامپایل شده، نمی توانید از \t برای اشاره به کاراکتر تب استفاده کنید بلکه می بایست به صورت دستی یک کاراکتر تب را کپی کرده و در ترمینال پیست کنید.

بیشتر آموزش های مرتبط با Regex با PCRE سازگار است که موتور پیش فرض پردازش Regex در زبان PHP است. موتور پردازش ریجکس در جاوااسکریپت و ریجکس Perl و سایر موارد متفاوت هستند. خوشبختانه در برخی سایت های دیباگ کردن ریجکس نظیر Regex101، امکان انتخاب کردن موتور ریجکس وجود دارد. لذا دقت کنید که موتور پردازش ریجکس را صحیح و متناسب با زبان برنامه نویسی انتخاب کنید.

استفاده از ریجکس

نحوه ی تطبیق دادن عبارت ها با Regex را به صورت مفید و مختصر توضیح دادیم اما در نهایت برای اجرا کردن یک فرآیند، می بایست عبارت منظم را کامل کنید. سینتکس عمومی یک عبارت منظم کامل به شکل زیر است:

/match/g

آنچه بین دو اسلش ذکر شده، عبارت تطبیقی است. حرف g در انتها موجب می شود که موتور پردازش ریجکس با یافتن اولین تطبیق، متوقف نشود بلکه تمام متن را بررسی کند.

برای جستجو و جایگزین کردن یک عبارت، می بایست از سینتکس زیر استفاده کنید:

/find/replace/g

به عنوان مثال اگر بخواهید در یک فایل HTML تمام تگ ها را پیدا کرده و به جای < و > کاراکتر [ و ] را جایگزین کنید، می توانید از ریجکس زیر استفاده کنید. در این ریجکس عبارت \1 برای ارجاع به اولین گروه که محتویات بین <  و > است، به کار رفته است:

/<(.+?)>/[\1]/g

نتیجه را در تصویر زیر مشاهده می کنید:

تفاوت Wildcard  با Regex

همان طور که اشاره کردیم از ریجکس برای معرفی الگو به موتور پردازش ریجکس استفاده می شود و هر عبارتی که مطابق با آن باشد، به عنوان نتیجه، پیدا می شود. اما منظور از Wildcard، کاراکترهای احتمالی است که چند حالت مختلف دارد. به عبارت دیگر برای اشاره به یک کاراکتر که دقیقاً مشخص نیست، از وایلدکاردها استفاده می شود. تعریف کردن ساختار به کمک Wildcard امکان پذیر است اما توانمندی Regex به مراتب بیشتر است.

به عنوان مثال زمانی که می خواهید کدهایی در ترمینال لینوکس اجرا کنید و فایل هایی با نام های متنوع که ابتدا با حرف a آغاز شده و سپس یک یا چند کاراکتر دیگر وجود دارد و در نهایت پسوند txt است، می توانید از Wildcard استفاده کنید.

a*.txt

در عبارت فوق * برای اشاره به کاراکترهای احتمالی به کار رفته است.

همان طور که اشاره کردیم Wildcard بسیار مفید و کاربردی است اما در عین حال به مراتب ساده تر از ریجکس است. البته وایلدکارد نیز شامل چند نماد مختلف می شود که معنای متفاوتی دارند. به جدول زیر توجه کنید:

نماد مفهوم نمونه مثال کاربردی
* صفر کاراکتر یا بیشتر  *bl عبارات bl ،black ،blue و blob را پیدا می کند.
? یک کاراکتر دلخواه h?t عبارات hat ،hot و hit را پیدا می کند.
[] یکی از کاراکترهای ذکر شده داخل براکت h[oa]t عبارات hat ،hot را پیدا می کند اما hit را خیر
! کاراکترهایی به جز آنچه ذکر شده h[!oa]t عبارت hit را پیدا می کند اما hot و hat را خیر
اشاره به محدوده ای از کاراکترها c[a-b]t عبارات cat و cbt را پیدا می کند
# کاراکتری از نوع عدد 2#5 اعداد 205 و 215 و 225 و … را پیدا می کند.