72- آموزش جاوااسکریپت | قسمت سوم - مجموعهکاراکترها، بازهها و گروهبندی در Regex
در این آموزش با مجموعهکاراکترها در Regex آشنا میشویم؛ یاد میگیریم با براکتها چند گزینه را تعریف کنیم، بازههای حروف و اعداد بسازیم، از quantifierها استفاده کنیم و با پرانتزها گروهبندی انجام دهیم.
در این بخش از آموزش عبارات باقاعده، وارد مرحلهای کاربردیتر میشویم و با مجموعهکاراکترها (Character Sets)، بازهها (Ranges)، کوانتیفایرها (Quantifiers) و گروهبندی (Grouping) آشنا میشویم.
برای اینکه تست الگوها سادهتر شود، ابتدا یک تابع کمکی میسازیم تا نتیجه را بهصورت خوانا در کنسول نمایش دهد:
function reTest(re, str) {
if (re.test(str)) {
console.log(`${str} matches ${re.source}`);
} else {
console.log(`${str} does not match ${re.source}`);
}
}
مجموعهکاراکترها با براکت
اگر بخواهیم یک بخش از الگو فقط یکی از چند کاراکتر مشخص باشد، از براکت استفاده میکنیم.
مثلاً در واژههایی مثل gray و grey، حرف وسط میتواند a یا e باشد:
let re = /gr[ae]y/i;
reTest(re, 'gray'); // matches
reTest(re, 'grey'); // matches
reTest(re, 'gryy'); // does not match
در این حالت، عبارت داخل براکت یعنی:
- این جایگاه فقط میتواند یکی از کاراکترهای داخل براکت باشد.
مجموعهکاراکتر در ابتدای الگو
براکت فقط برای وسط کلمه نیست. میتوان از آن در ابتدای الگو هم استفاده کرد.
مثلاً اگر بخواهیم رشته با G یا F شروع شود:
let re = /^[GF]ray/i;
reTest(re, 'Gray'); // matches
reTest(re, 'Fray'); // matches
reTest(re, 'Xray'); // does not match
اگر فلگ i را حذف کنیم، الگو به حروف بزرگ و کوچک حساس میشود:
let re = /^[GF]ray/;
reTest(re, 'Gray'); // matches
reTest(re, 'gray'); // does not match
منفی کردن مجموعهکاراکترها
اگر ^ را داخل براکت قرار دهیم، معنی آن برعکس میشود؛ یعنی:
هر کاراکتری بهجز موارد داخل براکت
let re = /[^GF]ray/i;
reTest(re, 'Xray'); // matches
reTest(re, 'Gray'); // does not match
reTest(re, 'Fray'); // does not match
نکته مهم:
^بیرون از براکت یعنی «شروع با»^داخل براکت یعنی «بهجز اینها»
بازهها (Ranges)
برای سادهتر نوشتن الگوها، میتوان از بازه استفاده کرد.
مثلاً برای هر حرف بزرگ:
let re = /[A-Z]ray/;
reTest(re, 'Xray'); // matches
reTest(re, 'Gray'); // matches
reTest(re, 'xray'); // does not match
برای هر حرف کوچک:
let re = /[a-z]ray/;
reTest(re, 'xray'); // matches
reTest(re, 'Xray'); // does not match
برای هر حرف، چه بزرگ و چه کوچک:
let re = /[A-Za-z]ray/;
reTest(re, 'Xray'); // matches
reTest(re, 'xray'); // matches
برای اعداد:
let re = /[0-9]ray/;
reTest(re, '1ray'); // matches
reTest(re, 'xray'); // does not match
همچنین میتوان چند رقم پشتسرهم را هم بررسی کرد:
let re = /[0-9][0-9]ray/;
reTest(re, '10ray'); // matches
reTest(re, '4ray'); // does not match
کوانتیفایرها با آکولاد
اگر بخواهیم یک کاراکتر چند بار تکرار شود، بهجای تکرار دستی از آکولاد استفاده میکنیم.
تکرار دقیق
مثلاً l باید دقیقاً 2 بار تکرار شود:
let re = /hel{2}o/i;
reTest(re, 'hello'); // matches
reTest(re, 'helo'); // does not match
reTest(re, 'helllo'); // does not match
تکرار بازهای
مثلاً l باید بین 2 تا 4 بار تکرار شود:
let re = /hel{2,4}o/i;
reTest(re, 'hello'); // matches
reTest(re, 'helllo'); // matches
reTest(re, 'hellllo'); // matches
reTest(re, 'helo'); // does not match
تکرار حداقل
اگر فقط عدد اول را بنویسیم، یعنی آن کاراکتر باید حداقل آن تعداد تکرار شود:
let re = /hel{2,}o/i;
reTest(re, 'hello'); // matches
reTest(re, 'hellllo'); // matches
reTest(re, 'helo'); // does not match
گروهبندی با پرانتز
پرانتزها برای گروهبندی به کار میروند.
این کار بیشتر زمانی مفید است که بخواهیم یک بخش چندکاراکتری را با کوانتیفایر کنترل کنیم.
مثلاً اگر بخواهیم الگو به صورت 3x3x3x تکرار شود:
let re = /^([0-9]x){3}$/;
reTest(re, '3x3x3x'); // matches
reTest(re, '3x3x3x3x'); // does not match
reTest(re, '3x3x'); // does not match
در این مثال:
([0-9]x)یک گروه است{3}یعنی این گروه باید 3 بار تکرار شود^و$هم تضمین میکنند که کل رشته دقیقاً مطابق الگو باشد
جمعبندی
در این بخش یاد گرفتیم:
- با براکت چند کاراکتر مجاز را تعریف کنیم
- با
^داخل براکت، الگو را منفی کنیم - از بازهها برای تعریف حروف و اعداد استفاده کنیم
- با آکولاد تعداد تکرار را مشخص کنیم
- با پرانتز بخشهای چندکاراکتری را گروهبندی کنیم
در بخش بعدی، سراغ شورتهند کاراکتر کلاسها میرویم؛ مثل \w، \d و \s که نوشتن الگوها را کوتاهتر و حرفهایتر میکنند.