مقدمه
یکی از ابزارهای قدرتمند برای کار با متن و دادههای رشتهای در جاوااسکریپت، عبارات باقاعده یا
Regular Expressions (یا به اختصار Regexp) است. با استفاده از این الگوها میتوانید به
راحتی دادهها را جستجو، اعتبارسنجی یا جایگزین کنید و حتی الگوهای پیچیده را در رشتهها شناسایی
کنید. یادگیری Regexp مهارت مهمی برای هر برنامهنویس حرفهای است.
مروری بر الگوهای رایج در عبارات باقاعده
عبارات باقاعده یا Regular Expressions الگوهایی هستند که
برای جستوجو، بررسی و ویرایش رشتههای متنی به کار میروند. این عبارات مجموعهای از کاراکترها،
نمادها و قوانین خاص هستند که میتوانند الگوهای ساده تا بسیار پیچیدهای را برای تطبیق بخشهایی از
متن توصیف کنند. به عنوان مثال، میتوانید با یک عبارت باقاعده، تمام شمارهتلفنها، ایمیلها،
تاریخها یا کلمات خاص را در یک متن پیدا یا جایگزین کنید، بدون اینکه نیاز باشد به صورت دستی کل
متن را بررسی نمایید.
در زبانهایی مانند جاوااسکریپت، عبارات باقاعده یک ابزار قدرتمند برای کار با دادههای متنی محسوب
میشوند. با استفاده از ترکیب نمادهای خاص (مانند \d برای اعداد، \w برای کاراکترهای کلمهای، ^
برای ابتدای رشته و $ برای انتهای رشته)، برنامهنویسان میتوانند به
راحتی الگوهای دلخواه خود را
تعریف و پیادهسازی کنند. عبارات باقاعده در پردازش ورودی کاربر، اعتبارسنجی فرمها، استخراج
اطلاعات و حتی پاکسازی دادهها نقش کلیدی دارند و یادگیری آنها یکی از مهارتهای مهم در
برنامهنویسی و تحلیل داده بهشمار میرود.
قبل ار اینکه به شیء Regexp و نحوهی استفاده از آن برای ساخت عبارات باقاعده بپردازیم،
اجازه دهید
ابتدا مروری داشته باشیم بر متداولترین و پرکاربردترین الگوهایی که در عبارات باقاعده دیده
میشوند.
-
\d
الگوی \d در عبارات باقاعده جاوااسکریپت برای تطبیق یک رقم عددی
منفرد (۰ تا ۹) به کار میرود.
اگر این الگو را در یک رشته جستوجو کنید، هر بار که به یک عدد برخورد کند، آن را پیدا خواهد
کرد. مثلاً الگوی /\d/ در رشتهی "a5b" عدد 5 را پیدا میکند.
برای پیدا کردن چند عدد پشت سر هم
میتوان از \d+ استفاده کرد که هر دنبالهای از ارقام را تطبیق
میدهد.
-
\w
الگوی \w نمایانگر هر کاراکتر "کلمهای" است که شامل حروف انگلیسی
(a-z و A-Z)، ارقام (۰ تا ۹)
و کاراکتر زیرخط (_) میشود. مثلاً الگوی /\w/ روی رشته
"hello_123" تمام حروف، اعداد و زیرخط
را جدا جدا پیدا میکند. برای تطبیق دنبالهای از این کاراکترها معمولاً از /\w+/ استفاده
میشود که یک یا چند کاراکتر کلمهای را در یک بخش متوالی استخراج میکند.
-
\s
الگوی \s برای تشخیص هر نوع فاصلهی سفید (whitespace) استفاده
میشود. این شامل فاصلهی معمولی
(space)، تب (\t)، رفتن به خط بعد (\n) و دیگر
فاصلههای استاندارد میشود. مثلاً /\s/ در رشته
"a b"، فضای بین a و b را پیدا میکند. اگر بخواهیم تمام فاصلههای پشت سر هم را پیدا کنیم
میتوانیم از /\s+/ استفاده کنیم.
-
^abc
الگوی ^abc بررسی میکند که آیا رشته دقیقاً با توالی حروف abc
شروع میشود یا نه. علامت ^ در
ابتدای عبارت باقاعده به معنی "شروع رشته" است. مثلاً /^abc/ روی
"abcdef" تطبیق دارد، اما روی
"xabc" ندارد. این الگو برای بررسی ابتدای رشته بسیار پرکاربرد است.
-
$abc
در این الگو، علامت $ به معنی "پایان رشته" است. بنابراین abc$
بررسی میکند که آیا رشته دقیقاً
با abc به پایان میرسد یا نه. به عنوان مثال، /abc$/ در رشتهی
"123abc" تطبیق دارد اما در
"abc123" ندارد. این الگو معمولاً زمانی استفاده میشود که بخواهیم مطمئن شویم یک رشته با
عبارتی خاص تمام میشود.
-
a{2,5}
الگوی a{2,5} به دنبال کاراکتر a میگردد که بین ۲ تا ۵ بار پشت سر هم تکرار شده باشد. به عبارت
دیگر، این الگو رشتههایی مثل "aa"، "aaa"، "aaaa" یا "aaaaa" را پیدا میکند، اما رشتههایی با
کمتر از دو یا بیشتر از پنج a متوالی را تطبیق نمیدهد. این شیوهی تعیین تعداد تکرارها در
عبارات باقاعده کاربرد زیادی دارد؛ مثلاً وقتی میخواهیم پسوردی با تعداد مشخصی کاراکتر تکراری
بررسی کنیم.
ساخت و استفاده از Regexp
برای ساخت یک عبارت باقاعده میتوانید از دو روش استفاده کنید: سینتکس اسلش /.../ یا
سازنده RegExp. هر دو روش امکانات یکسان دارند اما استفاده از اسلش خواناتر است.
JAVASCRIPT
let regex1 = /abc/;
let regex2 = new RegExp("abc");
تست و جستجوی رشته با Regexp
برای بررسی وجود یک الگو در رشته از متد test استفاده میکنیم. این متد یک مقدار بولین
برمیگرداند. همچنین، برای پیدا کردن همهی موارد یک الگو میتوانیم از متد match
استفاده کنیم که آرایهای از نتایج را بازمیگرداند.
JAVASCRIPT
let text = "JavaScript is awesome. JAVASCRIPT rocks!";
let regex = /javascript/gi;
console.log(regex.test(text));
console.log(text.match(regex));
در این مثال، با استفاده از متد test
بررسی میکنیم که آیا عبارت "javascript" (بدون
توجه به بزرگی یا کوچکی حروف به دلیل وجود پرچمهای g
و i
) در متن وجود
دارد یا نه. همچنین متد match
تمام موارد مطابق با الگو را به صورت آرایه
بازمیگرداند.
پرچمهای g و i باعث میشوند جستجو به صورت سراسری (global) و بدون توجه به بزرگی یا کوچکی حروف
(insensitive) انجام شود. پرچم g همه موارد را پیدا میکند و پرچم i حساسیت به حروف بزرگ و کوچک را
از بین میبرد.
تبدیل و جایگزینی با Regexp
با متد replace میتوانید بخشهایی از رشته را بر اساس الگو جایگزین کنید. این امکان برای
حذف کاراکترهای خاص، تصحیح قالب دادهها، فیلتر کردن شمارهها و ... بسیار مفید است.
همچنین با متد split میتوانید یک رشته را بر اساس الگوی مشخص به آرایه تقسیم کنید. این کار
برای تجزیه دادههای ورودی یا پردازش فایلهای متنی بسیار رایج است.
JAVASCRIPT
console.log(text.replace(/javascript/gi, "JS"));
let csv = "a,b,c,d";
console.log(csv.split(/,/));
یک مثال پیشرفته
در کد زیر از الگوهای مختلف عبارات باقاعده برای شناسایی ایمیل، استخراج اعداد و جایگزینی ارقام با
نماد # استفاده شده است. این مثالها نشان میدهند که چگونه میتوان با استفاده از Regexp عملیات
متنوعی روی رشتهها انجام داد و دادهها را به راحتی پردازش کرد.
JAVASCRIPT
let str = "user123@example.com";
console.log(/\w+@\w+\.\w+/.test(str));
console.log(str.match(/\d+/));
console.log("abc123".replace(/\d/g, "#"));
نوع داده Regexp و عبارات باقاعده یکی از پرکاربردترین ابزارهای کار با دادههای متنی، اعتبارسنجی
فرمها، جستجو و جایگزینی الگوها در رشتههاست. با تمرین و استفاده مداوم از این ابزار میتوانید
پروژههای پیشرفتهتری توسعه دهید و دادهها را بهتر مدیریت کنید.