جاوا اسکریپت پشتیبانی بسیار خوبی از regex دارد، از جمله یک زبان اصلی و چندین روش مفید.
عبارات منظم که عموماً به عنوان “regex” یا “regexp” شناخته می شوند، رشته هایی هستند که یک الگوی جستجو را توصیف می کنند. میتوانید از عبارات منظم برای بررسی اینکه آیا یک رشته دارای یک الگوی خاص است، استفاده کنید، اطلاعات را از یک رشته استخراج کنید و قسمتهایی از یک رشته را با متن جدید جایگزین کنید.
سینتکس اولیه عبارات منظم و نحوه استفاده از آنها در جاوا اسکریپت را بیاموزید.
نحو اساسی عبارات با قاعده
دو راه برای ایجاد یک عبارت منظم در جاوا اسکریپت وجود دارد: استفاده از یک عبارت منظم literal و استفاده از سازنده RegExp.
یک عبارت منظم تحت اللفظی شامل یک الگوی محصور شده بین اسلش های جلو و به دنبال آن یک پرچم اختیاری است.
مثلا:
// Without flag
const regexExpression_1 = /pattern/
// With flag
const regexExpression_2 = /pattern/flag
پرچم یک پارامتر اختیاری است که می توانید به یک عبارت منظم اضافه کنید تا رفتار آن را تغییر دهید. مثلا:
const regexFlag = /the/g;
پرچم g نشان می دهد که عبارت باید با همه رخدادها مطابقت داشته باشد، نه فقط با اولین.
همچنین می توانید با استفاده از سازنده RegExp یک عبارت منظم ایجاد کنید. مثلا:
const regexExpression = new RegExp("Pattern", "g");
سازنده RegExp دو پارامتر را می گیرد: یک الگو – یک رشته یا یک عبارت منظم – و یک پرچم (ها).
دو پرچم نسبتاً رایج وجود دارد که با عبارت منظم در جاوا اسکریپت استفاده می کنید:
- g: پرچم سراسری باعث می شود که عبارت منظم به جای یک رخداد منفرد، با تمام رخدادهای الگو در رشته داده شده مطابقت داشته باشد.
- i: پرچم حساس به حروف بزرگ باعث می شود که عبارت منظم از حروف الگو صرف نظر کند و کاراکترهای بزرگ و کوچک را در رشته داده شده مطابقت دهد.
شما می توانید پرچم ها را با هم در یک عبارت واحد به هر ترتیبی استفاده کنید. مثلا:
const regexExpression = new RegExp("Pattern", "gi");
این عبارت بدون در نظر گرفتن مورد، با تمام رخدادهای “Pattern” مطابقت دارد.
متاکاراکترهای بیان منظم
در عبارات منظم، کاراکترهای خاصی که به عنوان متاکاراکتر شناخته می شوند، معانی خاصی دارند. می توانید از آنها برای مطابقت با انواع خاصی از شخصیت ها یا الگوها استفاده کنید.
در اینجا برخی از متاکاراکترهای رایج و معانی آنها آورده شده است:
- کاراکتر Wildcard (.): این کاراکتر با هر کاراکتری به جز یک خط جدید مطابقت دارد. این ابزار مفیدی برای تطبیق الگوها با کاراکترهای ناشناخته است.
- ستاره Kleene (*): این کاراکتر با صفر یا تعداد بیشتری از شخصیت یا گروه قبلی مطابقت دارد. این به کاراکتر یا گروه قبلی اجازه می دهد تا هر تعداد بار از جمله صفر در رشته ظاهر شود.
- کاراکتر اختیاری (؟): این کاراکتر با صفر یا یک نویسه یا گروه قبلی مطابقت دارد.
- Start of Line Anchor (^): این کاراکتر فقط با ابتدای یک خط یا رشته مطابقت دارد.
- End of Line Anchor ($): این کاراکتر با انتهای یک خط یا رشته مطابقت دارد.
- مجموعه کاراکتر/کلاس ([]): یک مجموعه کاراکتر با هر کاراکتری از مجموعه کاراکترهای یک رشته مطابقت دارد. شما آنها را با استفاده از براکت [] تعریف میکنید و میتوانید مجموعهای از کاراکترهای ثابت، کاراکترهای خاص یا گروههای خاصی از کاراکترها را مشخص کنید.
- کاراکتر جایگزین (|): این کاراکتر با کاراکتر یا گروه قبلی یا زیر مطابقت دارد. به طور مشابه با اپراتور OR JavaScript کار می کند.
- کاراکتر گروهبندی (()): کاراکتر گروهبندی به شما امکان میدهد کاراکترها یا عبارات فرعی را گروهبندی کنید، عملگرها را بهعنوان یک واحد اعمال کنید و ترتیب عملیات را کنترل کنید.
تست یک رشته در برابر یک عبارت منظم در جاوا اسکریپت
در جاوا اسکریپت، می توانید یک رشته را در برابر یک عبارت معمولی با استفاده از چندین روش آزمایش کنید.
این بخش فرض می کند که شما درک اولیه ای از عبارات و الگوهای منظم دارید. اگر از عبارات منظم ناراحت هستید، ابتدا یک راهنمای مبتدی برای عبارات منظم را بررسی کنید.
روش آزمون
متد .test () یک بولی برمی گرداند که نشان می دهد آیا عبارت منظم با رشته مطابقت دارد یا خیر. این متد یک رشته را برای انجام جستجو به عنوان آرگومان می گیرد. به ویژه برای بررسی های ساده مفید است.
مثلا:
let regex = /.com$/;
let str = "example.com";
console.log(regex.test(str)); // true
این عبارت منظم با رشته ای که با “.com” ختم می شود مطابقت دارد.
روش exec
متد .exec() آرایه ای حاوی متن منطبق و هر گروه ضبط شده یا تهی را در صورتی که مطابقت پیدا نکرد، برمی گرداند. این متد یک رشته را برای انجام جستجو به عنوان آرگومان می گیرد. برای عبارات منظم پیچیده تر مفید است.
مثلا:
let regex = /^\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;
let str = "123-456-7890";
let result = regex.exec(str);
if (result !== null) {
console.log(`${result[0]} is a valid phone number`);
} else {
console.log("Invalid phone number");
}
عبارت منظم بالا با رشته ای مطابقت دارد که با یک «(»، سه رقمی و «) اختیاری» شروع می شود. سپس به دنبال یک «-»، «.» یا فاصله اختیاری میگردد که به دنبال آن سه رقم وجود دارد. در نهایت به دنبال یک “-“، “.”، یا فاصله اختیاری به دنبال چهار رقم در انتهای رشته می گردد.
این عبارت معمولی با شمارههای تلفن در قالب «(xxx) xxx-xxxx، «xxx-xxx-xxxx»، «xxx.xxx.xxxx» یا «xxx xxx xxxx» مطابقت دارد.
اگر مطابقت پیدا کند، .exec() یک آرایه حاوی متن منطبق و هر گروه ضبط شده (تعریف شده با پرانتز) را برمی گرداند. هر گروه را به عنوان یک عنصر اضافی در آرایه ای که برمی گرداند شامل می شود. این به شما امکان می دهد به بخش های خاصی از متن مطابقت دسترسی داشته باشید، که می تواند به شما در استخراج اطلاعات از یک رشته کمک کند.
روش جایگزینی
متد .replace() یک تطابق بین یک عبارت منظم و یک رشته را جستجو می کند و متن منطبق را با یک متن جایگزین مشخص جایگزین می کند. این یک روش برای اشیاء رشته ای است و یک عبارت منظم و یک رشته جایگزین را به عنوان آرگومان می گیرد.
مثلا:
let string = "The quick brown fox jumps over the lazy dog.";
let expression = /The/gi;
let newString = string.replace(expression, "a");
console.log(newString); // "a quick brown fox jumps over a lazy dog."
این مثال متد ()replace را روی متغیر رشته فراخوانی می کند و عبارت منظم، عبارت را ارسال می کند. عبارت منظم با تمام رخدادهای “The” در رشته، صرف نظر از مورد، مطابقت دارد. فراخوانی متد جایگزین به آن دستور می دهد تا هر رخداد را با رشته “a” جایگزین کند.
ملاحظات عملکرد هنگام استفاده از عبارات منظم
اگرچه عبارات منظم به تطابق و دستکاری رشته ها کمک می کنند، اما از نظر عملکرد نیز می توانند پرهزینه باشند. ساختن الگوها تا حد امکان خاص و ساده نگه داشتن آنها برای کارایی آنها حیاتی است.