شما میتوانید یک عبارت باقاعده را به یکی از دو روش زیر بسازید:
روش اول: استفاده از یک عبارت باقاعده ثابت (Literal)
این روش شامل یک الگو است که میان دو علامت اسلش (/) قرار میگیرد:
const re = /ab+c/;
عبارات باقاعده ثابت (Literal) هنگام بارگذاری اسکریپت کامپایل میشوند. اگر عبارت باقاعده شما در طول برنامه ثابت و بدون تغییر میماند، استفاده از این روش میتواند کارایی (Performance) برنامه را بهبود ببخشد.
روش دوم: صدا زدن تابع سازندهی شیء RegExp
این روش به صورت زیر نوشته میشود:
const re = new RegExp("ab+c");
استفاده از تابع سازنده، باعث کامپایل شدن عبارت باقاعده در زمان اجرای برنامه (Runtime) میشود. زمانی از تابع سازنده استفاده کنید که میدانید الگوی عبارت باقاعده قرار است تغییر کند، یا اینکه از الگو اطلاعی ندارید و آن را از منبع دیگری (مانند ورودی کاربر) دریافت میکنید.
یک الگوی عبارت باقاعده میتواند از کاراکترهای ساده (مانند /abc/) یا ترکیبی از کاراکترهای ساده و ویژه (مانند /ab*c/ یا /Chapter (\d+)\.\d*/) تشکیل شود. در مثال آخر، از پرانتزها استفاده شده است که به عنوان یک ابزار بهومند (حافظه) عمل میکنند؛ بخشی از رشته که با این قسمت از الگو مطابقت پیدا کند، برای استفادههای بعدی در حافظه نگهداری میشود (همانطور که در بخش گروهها توضیح داده شده است).
الگوهای ساده از کاراکترهایی ساخته میشوند که شما میخواهید یک تطابق مستقیم (Direct match) برای آنها پیدا کنید. به عنوان مثال، الگوی /abc/ تنها زمانی با ترکیبهای کاراکتری درون رشتهها مطابقت پیدا میکند که دقیقاً توالی کاراکترهای "abc" (همه کاراکترها در کنار هم و به همین ترتیب) رخ دهد.
چنین تطابقی در رشتههای "?Hi, do you know your abc's" و ".The latest airplane designs evolved from slabcraft" موفقیتآمیز خواهد بود و در هر دو حالت، با زیررشتهی "abc" مطابقت پیدا میکند. اما در رشتهی "Grab crab" هیچ تطابقی پیدا نمیشود؛ زیرا با وجود اینکه حاوی زیررشتهی "ab c" است، اما دقیقاً شامل زیررشتهی "abc" نیست.
زمانی که جستجو برای یک مطابقت به چیزی فراتر از یک تطابق مستقیم نیاز دارد (مثلاً پیدا کردن یک یا چند حرف b، یا پیدا کردن فاصله و وایتاسپیس)، میتوانید کاراکترهای ویژه را در الگو بگنجانید.
به عنوان مثال، برای مطابقت با یک حرف "a" که به دنبال آن صفر یا چند حرف "b" و سپس حرف "c" آمده است، از الگوی /ab*c/ استفاده میکنید: علامت * بعد از "b" یعنی «۰ یا چند بار تکرارِ آیتم قبلی». در رشتهی "cbbabbbbcdebc"، این الگو با زیررشتهی "abbbbc" مطابقت خواهد داشت.
لیست زیر کاراکترهای ویژهی مختلف را بر اساس دستهبندی آنها به همراه توضیحات نشان میدهد:
راهنمای Assertions (مفاهیم شرطی و مرزها): شامل مرزها میشود که ابتدا و انتهای خطوط و کلمات را مشخص میکنند، و همچنین الگوهای دیگری که به نوعی نشان میدهند یک مطابقت امکانپذیر است (شامل look-ahead، look-behind و عبارتهای شرطی).
راهنمای Character classes (کلاسهای کاراکتری): انواع مختلف کاراکترها را از هم متمایز میکنند؛ مثلاً تمایز قائل شدن بین حروف و ارقام.
راهنمای Groups and backreferences (گروهها و مراجع بازگشتی): گروهها چندین الگو را به عنوان یک کلِ واحد گروهبندی میکنند، و گروههای تسخیرکننده (Capturing groups) هنگام مطابقت دادن الگو با رشته، اطلاعات زیر-مطابقتِ بیشتری را ارائه میدهند. مراجع بازگشتی نیز به یک گروه که قبلاً در همان عبارت باقاعده تسخیر شده است، اشاره میکنند.
راهنمای Quantifiers (کمیتسنجها): تعداد کاراکترها یا عبارتهایی که باید مطابقت داده شوند را مشخص میکنند.
جدول زیر تمام کاراکترهای ویژهای که میتوانند در عبارات باقاعده استفاده شوند را به صورت یکجا خلاصه کرده است:
| کاراکترها / ساختارها | دستهبندی مربوطه |
[xyz], [^xyz], ., \d, \D, \w, \W, \s, \S, \t, \r, \n, \v, \f, [\b], \0, \cX, \xHH, \uHHHH, \u{H…H}, x|y | کلاسهای کاراکتری (Character classes) |
^, $, \b, \B, x(?=y), x(?!y), (?<=y)x, (?<!y)x | مفاهیم شرطی و مرزها (Assertions) |
(x), (?<Name>x), (?:x), \n, \k<Name> | گروهها و مراجع بازگشتی (Groups and backreferences) |
x*, x+, x?, x{n}, x{n,}, x{n,m} | کمیتسنجها (Quantifiers) |
اگر نیاز دارید از هر یک از کاراکترهای ویژه به صورت لغوی و معمولی استفاده کنید (مثلاً واقعاً به دنبال کاراکتر * بگردید)، باید با قرار دادن یک بکاسلش (\) در جلوی آن، آن را خنثی (Escape) کنید. به عنوان مثال، برای جستجوی حرف "a" که به دنبال آن علامت * و سپس حرف "b" آمده است، از /a\*b/ استفاده میکنید؛ در اینجا بکاسلش کاراکتر * را خنثی میکند و باعث میشود به جای یک کاراکتر ویژه، یک کاراکتر معمولی در نظر گرفته شود.
نکته: در بسیاری از موارد، هنگام تلاش برای مطابقت با یک کاراکتر ویژه، میتوانید به عنوان یک روش جایگزین برای خنثیسازی، آن را درون یک کلاس کاراکتری قرار دهید؛ به عنوان مثال:
/a[*]b/.
به همین ترتیب، اگر در حال نوشتن یک عبارت باقاعده ثابت (Literal) هستید و میخواهید با کاراکتر اسلش (/) مطابقت ایجاد کنید، باید آن را خنثی کنید (در غیر این صورت، الگو پایان مییابد). به عنوان مثال، برای جستجوی رشتهی "/example/" که به دنبال آن یک یا چند کاراکتر الفبایی آمده است، از /i++[a-z]\/example\/ استفاده میکنید.
برای مطابقت با خودِ کاراکتر بکاسلش به صورت لغوی، باید خودِ بکاسلش را خنثی کنید. به عنوان مثال، برای مطابقت با رشتهی ":C\" به طوری که "C" بتواند هر حرفی باشد، از /[A-Z]:\\/ استفاده میکنید؛ اولین بکاسلش کاراکتر بعد از خود را خنثی میکند، بنابراین عبارت به دنبال یک کاراکتر بکاسلش واقعی میگردد.
اگر از سازندهی RegExp همراه با یک رشته متنی (String literal) استفاده میکنید، به یاد داشته باشید که بکاسلش در رشتههای متنی خودش یک کاراکتر گریز است؛ بنابراین برای استفاده از آن در عبارت باقاعده، باید آن را در سطح رشته خنثی کنید. الگوهای /a\*b/ و ("new RegExp("a\\*b هر دو یک عبارت یکسان را میسازند که به دنبال حرف "a" و سپس یک علامت * واقعی و بعد از آن حرف "b" میگردد.
تابع RegExp.escape() رشتهی جدیدی را برمیگرداند که در آن تمام کاراکترهای ویژه در ساختار ریجکس خنثی (Escape) شدهاند. این قابلیت به شما اجازه میدهد تا با نوشتن ((new RegExp(RegExp.escape("a*b عبارتی بسازید که دقیقاً و صرفاً با رشتهی "a*b" مطابقت داشته باشد.
قرار دادن پرانتز دور هر بخش از الگوی عبارت باقاعده باعث میشود که آن بخش از زیررشتهی مطابقتیافته در حافظه سپرده شود. پس از به خاطر سپردن، این زیررشته میتواند برای مصارف دیگر بازخوانی و استفاده شود.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript