عبارات باقاعده به همراه متدهای مخصوص به خود یعنی test() و exec() از شیء RegExp و همچنین متدهای رشتهایِ match() ،matchAll() ،replace() ،replaceAll() ،search() و split() از شیء String استفاده میشوند.
| متد | توصیف کارکرد |
exec() | یک جستجو برای پیدا کردن مطابقت در رشته اجرا میکند. این متد آرایهای از اطلاعات را برمیگرداند و در صورت عدم تطابق، مقدار null میدهد. |
test() | وجود یک مطابقت در رشته را آزمایش میکند و مقدار true یا false برمیگرداند. |
match() | آرایهای حاوی تمام مطابقتها (شامل گروههای تسخیرشده) را برمیگرداند و اگر مطابقتی پیدا نشود، null میدهد. |
matchAll() | یک ایتریتور (Iterator) حاوی تمام مطابقتها (شامل گروههای تسخیرشده) را برمیگرداند. |
search() | وجود یک مطابقت در رشته را آزمایش میکند و ایندکسِ محل مطابقت را برمیگرداند. در صورت شکست در جستجو، مقدار 1- میدهد. |
replace() | یک جستجو برای پیدا کردن مطابقت در رشته اجرا کرده و زیررشتهی مطابقتیافته را با یک زیررشتهی جایگزین، عوض میکند. |
replaceAll() | جستجو را برای تمام مطابقتهای موجود در رشته اجرا کرده و همهی زیررشتههای مطابقتیافته را با زیررشتهی جایگزین، عوض میکند. |
split() | از یک عبارت باقاعده یا یک رشته ثابت استفاده میکند تا یک رشته را شکسته و آن را به آرایهای از زیررشتهها تبدیل کند. |
وقتی فقط میخواهید بدانید آیا یک الگو در رشته پیدا میشود یا خیر، از متدهای test() یا search() استفاده کنید. اما برای کسب اطلاعات بیشتر (که البته اجرای کندتری دارد) از متدهای exec() یا match() بهره ببرید.
اگر از exec() یا match() استفاده کنید و مطابقت با موفقیت انجام شود، این متدها یک آرایه را برمیگردانند و ویژگیهای شیء عبارت باقاعده مرتبط و همچنین ویژگیهای شیء پیشفرض و سراسری RegExp را بهروزرسانی میکنند. اگر مطابقت شکست بخورد، متد exec() مقدار null را برمیگرداند (که در ارزیابیهای شرطی به false تبدیل میشود).
به عنوان مثال، در کد زیر از متد exec() برای پیدا کردن مطابقت در یک رشته استفاده شده است:
const myRe = /d(b+)d/g;
const myArray = myRe.exec("cdbbdbsbz");
اگر نیازی به دسترسی به ویژگیهای عبارت باقاعده ندارید، یک راه جایگزین برای ساخت آرایهی myArray به این صورت است:
const myArray = /d(b+)d/g.exec("cdbbdbsbz");
// این کار شبیه به دستور زیر است:
// 'cdbbdbsbz'.match(/d(b+)d/g);
// با این حال خروجیها تفاوت دارند:
// 'cdbbdbsbz'.match(/d(b+)d/g) خروجی میدهد: [ "dbbd" ]
// در حالی که /d(b+)d/g.exec('cdbbdbsbz') خروجی میدهد: [ 'dbbd', 'bb', index: 1, input: 'cdbbdbsbz' ]
اگر میخواهید عبارت باقاعده را از روی یک رشته متنی بسازید، راهکار دیگر به این صورت خواهد بود:
const myRe = new RegExp("d(b+)d", "g");
const myArray = myRe.exec("cdbbdbsbz");
با اجرای این کدها، مطابقت با موفقیت انجام شده، آرایه برگردانده میشود و ویژگیهای نشان داده شده در جدول زیر بهروزرسانی خواهند شد:
| شیء | ویژگی یا ایندکس | توصیف کارکرد | مقدار در این مثال |
myArray | - | رشتهی مطابقتیافته و تمام زیررشتههای به خاطر سپرده شده. | ['dbbd', 'bb', index: 1, input: 'cdbbdbsbz'] |
myArray | index | ایندکسِ مبتنی بر صفرِ محل مطابقت در رشتهی ورودی. | 1 |
myArray | input | رشتهی اصلی ورودی. | 'cdbbdbsbz' |
myArray | [0] | آخرین کاراکترهای مطابقتیافته. | 'dbbd' |
myRe | lastIndex | ایندکسی که جستجوی بعدی باید از آنجا شروع شود (این ویژگی تنها در صورتی تنظیم میشود که در عبارت باقاعده از فلگ g استفاده شده باشد). | 5 |
myRe | source | متنِ خودِ الگو. این ویژگی در زمان ساخت عبارت باقاعده تنظیم میشود، نه در زمان اجرا. | 'd(b+)d' |
همانطور که در شکل دوم این مثال دیدیم، شما میتوانید از یک عبارت باقاعده که با شیء مقدار ثابت (Literal) ساخته شده است، بدون اختصاص دادن آن به متغیر استفاده کنید. با این حال، اگر این کار را انجام دهید، هر بار استفاده از آن به عنوان یک عبارت باقاعده جدید و مجزا در نظر گرفته میشود. به همین دلیل، اگر بدون اختصاص دادن به متغیر از این روش استفاده کنید، بعداً نمیتوانید به ویژگیهای آن عبارت باقاعده دسترسی داشته باشید.
برای مثال، این کد را در نظر بگیرید:
const myRe = /d(b+)d/g;
const myArray = myRe.exec("cdbbdbsbz");
console.log(`The value of lastIndex is ${myRe.lastIndex}`);
// خروجی: "The value of lastIndex is 5"
اما اگر کد را به این شکل بنویسید:
const myArray = /d(b+)d/g.exec("cdbbdbsbz");
console.log(`The value of lastIndex is ${/d(b+)d/g.lastIndex}`);
// خروجی: "The value of lastIndex is 0"
در حالت دوم، دو باری که از عبارت /d(b+)d/g استفاده شده است، دو شیء عبارت باقاعده کاملاً متفاوت هستند و در نتیجه مقادیر ویژگی lastIndex آنها با هم فرق دارد. پس اگر نیاز دارید به ویژگیهای یک عبارت باقاعده دسترسی داشته باشید، باید ابتدا آن را به یک متغیر اختصاص دهید.
عبارات باقاعده دارای فلگهای اختیاری هستند که قابلیتهایی مانند جستجوی سراسری یا جستجوی بدون حساسیت به حروف کوچک و بزرگ را ممکن میسازند. این فلگها میتوانند به صورت مجزا یا در کنار یکدیگر و با هر ترتیبی استفاده شوند و به عنوان بخشی از عبارت باقاعده قرار میگیرند.
| فلگ | توصیف کارکرد | ویژگی متناظر در شیء |
d | تولید ایندکسها برای مطابقتهای زیررشتهها. | hasIndices |
g | جستجوی سراسری (Global search). | global |
i | جستجوی بدون حساسیت به حروف کوچک و بزرگ (Case-insensitive). | ignoreCase |
m | باعث میشود کاراکترهای ^ و $ به جای ابتدا و انتهای کل رشته، با ابتدا و انتهای هر خط مطابقت داشته باشند. | multiline |
s | اجازه میدهد کاراکتر نقطه (.) با کاراکترهای خط جدید (Newline) نیز مطابقت داشته باشد. | dotAll |
u | حالت یونیکد؛ الگو را به عنوان دنبالهای از نقاط کد یونیکد در نظر میگیرد. | unicode |
v | نسخهی ارتقایافتهی حالت u همراه با قابلیتهای بیشتر برای یونیکد. | unicodeSets |
y | اجرای جستجوی چسبنده (Sticky) که مطابقت را دقیقاً از موقعیت فعلی در رشته هدف بررسی میکند. | sticky |
برای گنجاندن یک فلگ در عبارت باقاعده، از این ساختارها استفاده کنید:
const re = /pattern/flags;
یا:
const re = new RegExp("pattern", "flags");
به یاد داشته باشید که فلگها بخش جداییناپذیر یک عبارت باقاعده هستند و نمیتوان آنها را بعداً اضافه کرد یا حذف نمود.
به عنوان مثال، عبارت re = /\w+\s/g یک عبارت باقاعده میسازد که به دنبال یک یا چند کاراکتر متنی میگردد که بعد از آنها یک فاصله (Space) قرار دارد، و این ترکیب را در سراسر رشته جستجو میکند:
const re = /\w+\s/g;
const str = "fee fi fo fum";
const myArray = str.match(re);
console.log(myArray); // خروجی: ["fee ", "fi ", "fo "]
شما میتوانید خط اول را با ساختار زیر جایگزین کنید و دقیقاً همان نتیجه را بگیرید:
const re = new RegExp("\\w+\\s", "g");
فلگ m برای مشخص کردن این موضوع استفاده میشود که یک رشتهی ورودیِ چندخطی باید به عنوان چندین خط مجزا در نظر گرفته شود. در صورت استفاده از فلگ m، کاراکترهای ^ و $ به جای ابتدا یا انتهای کل رشته، با ابتدا یا انتهای هر خط در داخل رشتهی ورودی مطابقت پیدا میکنند.
نکته: فلگهای
i،mوsرا میتوان برای بخشهای خاصی از یک ریجکس با استفاده از نحو تغییردهندهها (Modifier syntax) فعال یا غیرفعال کرد.
g) به همراه exec()متد RegExp.prototype.exec() در صورت استفاده از فلگ g، هر مطابقت و موقعیت آن را به صورت تکرارپذیر (ایترتیو) برمیگرداند:
const str = "fee fi fo fum";
const re = /\w+\s/g;
console.log(re.exec(str)); // ["fee ", index: 0, input: "fee fi fo fum"]
console.log(re.exec(str)); // ["fi ", index: 4, input: "fee fi fo fum"]
console.log(re.exec(str)); // ["fo ", index: 7, input: "fee fi fo fum"]
console.log(re.exec(str)); // null (دیگر مطابقتی وجود ندارد)
در مقابل، متد String.prototype.match() تمام مطابقتها را به صورت یکجا، اما بدون مشخص کردن موقعیت و ایندکس آنها برمیگرداند:
console.log(str.match(re)); // ["fee ", "fi ", "fo "]
فلگ u برای ایجاد عبارات باقاعده یونیکد استفاده میشود؛ یعنی عباراتی که از مطابقت با متون یونیکد پشتیبانی میکنند. یک ویژگی مهم که در حالت یونیکد فعال میشود، گریزهای ویژگی یونیکد (Unicode property escapes) است. برای مثال، از عبارت باقاعده زیر میتوان برای مطابقت با یک «کلمه» دلخواه در سیستم یونیکد استفاده کرد:
/\p{L}*/u;
عبارات باقاعده یونیکد رفتار اجرای متفاوتی نیز دارند که توضیحات بیشتر دربارهی آن در بخش RegExp.prototype.unicode آمده است.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript