تا حالا به این فکر کردی که چطور میتونی الگوهایی مثل ایمیل، شماره تلفن یا حتی یک کلمه خاص رو درون یه متن طولانی بهراحتی پیدا کنی؟ اینجاست که RegEx یا “عبارت باقاعده” وارد میشه و بهت کمک میکنه تا مثل یک کارآگاه حرفهای، به دنبال الگوهای خاص در متنها بگردی!
شاید اسم RegEx در نگاه اول پیچیده به نظر برسه، ولی نگران نباش! این ابزار قدرتمند بهت کمک میکنه متنها رو بهسرعت بررسی کنی و الگوهای مختلف رو پیدا کنی یا بررسی کنی. مثلاً میخوای مطمئن شی که کاربر یه ایمیل درست وارد کرده؟ RegEx به راحتی این کار رو انجام میده.
در ادامه، قدم به قدم با هم یاد میگیریم که چطور از این ابزار جادویی استفاده کنی. آمادهای؟ پس بزن بریم تا دنیای RegEx رو کشف کنیم!
تاریخچه
تاریخچه RegEx به سالهای ۱۹۵۰ برمیگرده، وقتی یه ریاضیدان آمریکایی به نام استفن کلین (Stephen Kleene) ایدهی اولیهاش رو برای توصیف زبانهای رسمی و الگوهای تکرار، ارائه داد. هدفش در واقع این بود که با استفاده از نشانههای ریاضی، بتونه الگوهای زبانی رو بهصورت فرمولی توصیف کنه.
بعدها این ایدهها توسط دانشمندای علوم کامپیوتر توسعه پیدا کرد و وارد حوزه برنامهنویسی شد. در دهه ۱۹۶۰، کن تامپسون (Ken Thompson) که یکی از سازندگان سیستمعامل UNIX بود، برای اولین بار از این مفاهیم در ابزارهای جستوجوی متن در این سیستمعامل استفاده کرد. اینجا بود که Regular Expressions وارد دنیای نرمافزار شد.
با گذر زمان، RegEx به یکی از ابزارهای مهم در خیلی از زبانهای برنامهنویسی تبدیل شد، از Perl و Python گرفته تا JavaScript و PHP. امروز دیگه RegEx نهتنها توی جستوجوی متن، بلکه توی پردازش دادهها، اعتبارسنجی ورودیها و کلی کاربرد دیگه توی اپلیکیشنها استفاده میشه.
اصول اولیه RegEx
یه مجموعه از کاراکتر های خاصه که وقتی کنار هم قرار میگیرن ، یه الگو برای جستوجو یا تطبیق متن میسازن. این الگوها بهت کمک میکنن تا متون خاصی رو در فایلها یا ورودیها پیدا کنی. حالا بریم ببینیم چطوری میشه از این کاراکترها استفاده کرد.
کاراکترهای خاص (Special Characters):
1. نقطه (`.`):
– این کاراکتر هر چیزی رو به جز خط جدید تطبیق میده.
– مثال:
– الگوی `a.b` متنهایی مثل “a3b” یا “acb” رو پیدا میکنه، اما “ab” رو نه، چون یه کاراکتر باید بین “a” و “b” باشه.
2. ستاره (`*`):
– کاراکتر قبل خودش رو ۰ یا بینهایت بار تکرار میکنه.
– مثال:
– الگوی `ca*t` متنهایی مثل “ct”، “cat”، و “caaat” رو تطبیق میده. چون میگه “a” میتونه صفر بار یا بیشتر تکرار بشه.
3. بعلاوه (`+`):
– حداقل یک بار تکرار کاراکتر قبل خودش رو میخواد.
– مثال:
– الگوی `ca+t` فقط متنهایی مثل “cat” یا “caaat” رو پیدا میکنه. ولی “ct” رو نه، چون حداقل یه “a” باید وجود داشته باشه.
4. علامت سوال (`?`):
– کاراکتر قبل خودش رو اختیاری میکنه. یعنی اون کاراکتر میتونه باشه یا نباشه.
– مثال:
– الگوی `colou?r` میتونه هر دو کلمه “color” و “colour” رو پیدا کنه. چون “u” اختیاریه.
5. کروشهها `[ ]`:
– هر چیزی که بین کروشهها قرار بگیره، یکی از اونها باید در متن باشه.
– مثال:
– الگوی `[aeiou]` هر کلمهای که شامل یکی از حروف صدادار انگلیسی (a, e, i, o, u) باشه رو پیدا میکنه.
– `[0-9]` هر عددی بین ۰ تا ۹ رو تطبیق میده.
6. خط تیره (`-`):
– برای تعریف محدوده استفاده میشه.
– مثال:
– الگوی `[a-z]` یعنی هر حرف کوچکی بین a تا z رو پیدا کن.
– `[A-Z]` یعنی هر حرف بزرگی بین A تا Z.
7. خط عمودی (`|`):
– به معنای “یا” هست. یعنی یکی از موارد تطبیق داده بشه.
– مثال:
– الگوی `cat|dog` به دنبال “cat” یا “dog” میگرده.
8. پرانتزها `( )`:
– برای گروهبندی به کار میرن.
– مثال:
– الگوی `(ab)+` به دنبال تکرارهای “ab” هست، مثل “abab” یا “ab”.
مثال های کاربردی
وقتشه چند تا مثال عملی از استفاده RegEx رو ببینیم. این مثالها بهت کمک میکنن تا بفهمی چطوری میتونی از RegEx برای پیدا کردن اطلاعات خاص مثل ایمیلها، شماره تلفنها و تاریخها استفاده کنی.
بررسی صحت ایمیل
یکی از پرکاربردترین موارد استفاده از RegEx، بررسی صحت ایمیلهاست. با نوشتن یک الگوی مناسب، میتونی مطمئن بشی که ورودی کاربر شبیه به یک ایمیل معتبره.
– الگو:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
– این الگو مطمئن میشه که:
1. قبل از علامت @ ترکیبی از حروف، اعداد، نقطه، خط زیر و دیگر نمادها وجود داره.
2. بعد از @، یک دامنه معتبر مثل “domain” و یک پسوند مثل “.com” باشه.
پیدا کردن شماره تلفن
یکی از مواردی که قطعا توی اعتبار سنجی ها به کارتون میاد بررسی شماره تلفنه. شما قطعا نیاز دارید که توی بستر هایی که نیاز به شماره تماس دارن از اعتبارشون مطمئن بشید ؛ یعنی کاربر مثلا یه شماره تلفن ۵ رقمی وارد نکنه و اگه کرد بهش خطا نمایش داده بشه.
– الگو :
09[0-9]{9}
– این الگو:
1. با “09” شروع میشه.
2. بعد از اون، ۹ عدد پشت سر هم میآد که شماره تلفن رو تشکیل میده.
مثال واقعی:
این الگو میتونه شمارههایی مثل “09123456789” یا “09391234567” رو پیدا کنه.
پیدا کردن تاریخ شمسی
برای پیدا کردن تاریخهایی با فرمت شمسی مثل “1403/06/17” میتونیم از الگوی زیر استفاده کنیم:
– الگو برای تاریخ شمسی:
13[0-9]{2}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])
– این الگو:
1. با ۱۳ شروع میشه و بعدش دو عدد بین ۰۰ تا ۹۹ برای قرن ۱۴ هست.
2. ماه بین ۰۱ تا ۱۲ هست.
3. روز بین ۰۱ تا ۳۱ تطبیق داده میشه.
مثال واقعی:
این الگو میتونه تاریخهایی مثل “1402/06/10” یا “1399/12/29” رو پیدا کنه.
جستجو پیشرفته
حالا که با اصول پایهای و مثالهای کاربردی آشنا شدی، میتونیم از قابلیتهای پیشرفتهتر RegEx استفاده کنیم تا جستوجوهای پیچیدهتر و دقیقتری رو انجام بدیم. در این بخش با دو مفهوم مهم حالتهای تطبیق (Flags) و عبارات تکراری (Repetitions) آشنا میشیم.
1. استفاده از حالتهای تطبیق (Flags)
حالتهای تطبیق یا Flags بهت امکان میدن تا رفتار جستوجوی RegEx رو تغییر بدی. این حالتها معمولاً بعد از الگو قرار میگیرن و بهت کمک میکنن تا جستوجوی حساس به حروف بزرگ و کوچک یا جستوجوی چندخطی انجام بدی. مهمترین حالتها شامل موارد زیر هستن:
– `i`: غیرفعال کردن حساسیت به حروف بزرگ و کوچک.
– مثال:
– الگوی `cat` با Flag `i` به شکل `/cat/i` هم “cat” رو پیدا میکنه و هم “Cat” یا “CAT”.
– `g`: جستوجوی همه تطبیقها (نه فقط اولین مورد).
– مثال:
– الگوی `/cat/g` در کل متن دنبال همه کلمات “cat” میگرده، نه فقط اولین مورد.
– `m`: تطبیق چندخطی.
– مثال:
– وقتی از Flag `m` استفاده میکنی، نشانه `^` (شروع خط) و `$` (پایان خط) در تمام خطوط یک متن عمل میکنن.
مثال کاربردی:
فرض کن میخوای کلمه “Error” رو توی یه لاگ پیدا کنی، بدون توجه به اینکه با حرف بزرگ یا کوچک نوشته شده. از الگوی زیر استفاده میکنی:
error/i/
این الگو هم “error” و هم “Error” و هم “ERROR” رو پیدا میکنه.
2. استفاده از عبارات تکراری (Repetitions)
گاهی اوقات میخوای یک الگو چندین بار تکرار بشه. برای این کار از عبارات تکراری استفاده میکنیم که اجازه میده تعیین کنی یک بخش از الگو چند بار باید تکرار بشه. چند تا از پرکاربردترین عبارات تکراری عبارتاند از:
– `{n}`: دقیقاً n بار تکرار.
– مثال:
– الگوی `\d{3}` یعنی دقیقاً سه عدد پشت سر هم، مثل “123”.
– `{n,}`: حداقل n بار تکرار.
– مثال:
– الگوی `a{2,}` به دنبال دو یا بیشتر از دو “a” میگرده، مثل “aa” یا “aaa”.
– `{n,m}`: حداقل n و حداکثر m بار تکرار.
– مثال:
– الگوی `\d{2,4}` یعنی حداقل ۲ و حداکثر ۴ رقم پشت سر هم، مثل “12” یا “1234”.
مثال کاربردی:
فرض کن میخوای شماره کارت بانکی رو چک کنی که ۱۶ رقمی باشه. از الگوی زیر استفاده میکنی:
\d{16}
این الگو دقیقاً ۱۶ عدد پشت سر هم مثل “1234567812345678” رو پیدا میکنه.
مثال های واقعی
خب دیگه تا الان باید فهمیده باشید که قضیه از چه قراره و اصول RegEx رو یاد گرفته باشید. وقتشه چندتا مثال واقعی رو باهم توی اپ ها و سایت های مختلف و واقعی ببینم و تا بیشتر با کاربرد RegEx آشنا بشید.
– مثال ها با زبان جاوا اسکریپت نوشته شدن.
1. اعتبارسنجی فرمها در اپلیکیشنهای وب
در اپلیکیشنهای تحت وب، یکی از استفادههای اصلی از RegEx اعتبارسنجی ورودیهای کاربران مثل ایمیل، شماره تلفن و پسورد هست.
– مثال کاربردی در فرم ثبتنام:
– در یک اپلیکیشن، وقتی کاربر در حال ثبتنام هست، باید ایمیل خودش رو وارد کنه. برای اطمینان از اینکه ایمیل وارد شده درست باشه، از این الگو استفاده میکنی:
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
if (!emailRegex.test(userEmail)) {
console.log('ایمیل وارد شده صحیح نیست.');
}
– کاربرد واقعی: با این روش میتونی اطمینان پیدا کنی که ایمیل وارد شده به فرمت معتبره و جلوی ورود دادههای نادرست گرفته بشه.
2. پیدا کردن و جایگزینی دادهها در متون بزرگ
فرض کن یک اپلیکیشن وبلاگ داری و میخوای همه لینکهای داخلی سایتت رو در متنهای بلاگ به یک فرمت خاص تغییر بدی. به جای اینکه همه متون رو دستی تغییر بدی، میتونی از RegEx استفاده کنی تا همه لینکها رو پیدا و اصلاح کنی.
– مثال کاربردی:
فرض کن همه لینکهای داخلی به این شکل هستن:
`http://oldsite.com`
و میخوای اونها رو به
`https://newsite.com`
تغییر بدی.
میتونی از این الگو استفاده کنی:
const content = "متن وبلاگ با لینک http://oldsite.com/page1 و http://oldsite.com/page2";
const updatedContent = content.replace(/http:\/\/oldsite\.com/g, 'https://newsite.com');
console.log(updatedContent);
– نتیجه: همه لینکها به شکل جدید و امن “https” جایگزین میشن.
3. استخراج اطلاعات مهم از یک فایل لاگ
در اپلیکیشنهای بزرگ و سرورهای وب، فایلهای لاگ حجم زیادی از دادههای سیستمی رو تولید میکنن. اگر بخوای اطلاعات خاصی مثل تاریخچه ارورها یا آدرسهای IP رو از این فایلها استخراج کنی، RegEx کمک بزرگیه.
– مثال کاربردی:
– فرض کن یک فایل لاگ داری که میخوای فقط خطاهای مربوط به “Error” و تاریخها رو ازش استخراج کنی:
const logContent = "2024-09-07 12:34:56 [Error] Database connection failed\n2024-09-07 12:35:00 [Info] User logged in\n2024-09-07 12:36:10 [Error] Failed to load page";
const errorRegex = /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \[Error\].*/g;
const errorLogs = logContent.match(errorRegex);
console.log(errorLogs);
– نتیجه: خطاهای مربوط به “Error” رو همراه با تاریخ و زمان نمایش میده و به راحتی میتونی بفهمی که چه زمانی خطاها رخ داده.
4. استخراج شماره سفارش یا فاکتور از ایمیلهای مشتریان
در اپلیکیشنهای فروشگاهی یا پشتیبانی مشتری، معمولاً مشتریها اطلاعاتی مثل شماره سفارش یا شماره فاکتور رو ارسال میکنن. برای استخراج خودکار این اطلاعات از متن ایمیلها، میتونی از RegEx استفاده کنی.
– مثال کاربردی:
– فرض کن میخوای از ایمیل مشتری شماره فاکتوری که فرمتش به شکل “INV-12345” هست رو استخراج کنی:
const emailContent = "سلام، من سفارش خودم به شماره فاکتور INV-12345 رو پیگیری میکنم.";
const invoiceRegex = /INV-\d{5}/g;
const invoiceNumber = emailContent.match(invoiceRegex);
console.log(invoiceNumber);
– نتیجه: شماره فاکتور “INV-12345” رو از متن ایمیل استخراج میکنه.
5. فیلتر کردن پیامهای چت در اپلیکیشن پیامرسان
در اپلیکیشنهای پیامرسان یا شبکههای اجتماعی، ممکنه بخوای پیامهایی که شامل کلمات خاص یا نامناسب هستن رو فیلتر کنی. این کار رو به راحتی میتونی با RegEx انجام بدی.
– مثال کاربردی:
– فرض کن میخوای پیامهایی که شامل کلمات نامناسب مثل “فحش” باشن، فیلتر کنی:
const chatMessage = "این یک پیام شامل فحش است.";
const badWordRegex = /فحش|ناسزا|کلمات_دیگر/g;
if (badWordRegex.test(chatMessage)) {
console.log('این پیام شامل کلمات نامناسب است.');
}
– نتیجه: اگر پیام شامل کلمات نامناسب باشه، به راحتی فیلتر میشه.
6. پیدا کردن دادههای مهم از یک فایل CSV
فرض کن در یک اپلیکیشن تحلیلی دادههای فروش رو از فایلهای CSV استخراج میکنی. با استفاده از RegEx، میتونی به سرعت دادههای خاصی رو از فایلها پیدا و پردازش کنی.
– مثال کاربردی:
– فرض کن میخوای در یک فایل CSV شمارههای مشتری رو که با “09” شروع میشن پیدا کنی:
const csvData = "Name,Phone\nAli,09123456789\nSara,09391234567";
const phoneRegex = /09[0-9]{9}/g;
const phoneNumbers = csvData.match(phoneRegex);
console.log(phoneNumbers);
– نتیجه: شمارههای تلفن “09123456789” و “09391234567” رو از فایل CSV پیدا میکنه.
نتیجه گیری
خب، میتونیم بگیم که RegEx در نگاه اول شاید پیچیده و گیجکننده به نظر برسه، اما وقتی دستت بهش راه بیفته، میتونی ازش برای کلی کار خفن استفاده کنی. از پیدا کردن ایمیل و شماره تلفن گرفته تا فیلتر کردن پیامهای نامناسب، RegEx بهت این قدرت رو میده که با چند تا الگو کلی از مشکلات برنامهت رو حل کنی.
هرچند ممکنه اولش سخت باشه، اما وقتی یادش بگیری، خیلی کارها رو سریعتر و دقیقتر انجام میدی. خلاصه اینکه، RegEx مثل یه عصای جادویی توی دنیای برنامهنویسیه که اگه باهاش خوب کار کنی، خیلی از دردسرها رو از سر راهت برمیداره.