سلام! من نگینم. بذار یه چیزی رو اول کار بهت بگم: همهی ما برنامهنویسها یه روزی، یه جایی، ساعتها از وقتمون رو سر یه الگوی رجکس (Regex) که کار نمیکرده هدر دادیم. حس کلافگی عجیبیه!
ما فکر میکنیم الگو درسته، اما در واقع داریم با محدودیتها و خطاهای رایج در رجکس (مثل بکترکینگ فاجعهبار یا Catastrophic Backtracking) دستوپنجه نرم میکنیم و خودمون خبر نداریم.
دقیقاً به همین دلیله که «تستر آنلاین» اختراع شد! این ابزارها زمین بازی امن ما هستن که قبل از فاجعه، جلوی ضرر رو میگیرن. تو این گپ دوستانه، میخوام بهت بگم کدوم ابزارها عصای دست من شدن و چطوری ازشون به شکل حرفهای استفاده کنی که دیگه هیچوقت از رجکس نترسی.
جدول کاربردی (مقایسه سریع ابزارهای تست Regex)
قبل از اینکه بریم سراغ معرفی تکتکشون، بیا تو یه نگاه ببینیم هرکدوم به درد چه کاری میخورن:
| نام ابزار | بهترین کاربرد | قابلیت کلیدی که عاشقش میشی! |
|---|---|---|
| Regex101 | کارهای حرفهای، دیباگ عمیق و اطمینان از سازگاری | توضیح قدمبهقدم الگو (Explanation) و انتخاب «طعم» (Flavor) |
| Regexr | یادگیری، تستهای سریع و درک بصری | رابط کاربری فوقالعاده تمیز و برگه تقلب (Cheatsheet) تعاملی |
| Debuggex | فهمیدن الگوهای پیچیده و تو در تو | تبدیل الگوی متنی به «دیاگرام بصری» (فلوچارت) |
نام ابزار
بهترین کاربرد
قابلیت کلیدی که عاشقش میشی!
Regex101
کارهای حرفهای، دیباگ عمیق و اطمینان از سازگاری
توضیح قدمبهقدم الگو (Explanation) و انتخاب «طعم» (Flavor)
Regexr
یادگیری، تستهای سریع و درک بصری
رابط کاربری فوقالعاده تمیز و برگه تقلب (Cheatsheet) تعاملی
Debuggex
فهمیدن الگوهای پیچیده و تو در تو
تبدیل الگوی متنی به «دیاگرام بصری» (فلوچارت)
چرا استفاده از تستر آنلاین Regex برای هر توسعهدهندهای ضروری است؟
بذار یه اعتراف دوستانه بکنم: منم مثل خیلی از شماها، روزگاری از «عبارت باقاعده» یا همون Regex (رجکس) فراری بودم! حس میکردم دارم با یه زبون فضایی یا طلسم جادویی حرف میزنم. میدونی بدترین قسمتش چی بود؟ اینکه یه الگو مینوشتم، توی کدم میذاشتم، برنامه رو ران میکردم… و کار نمیکرد!
حالا بیا بگرد پرتقالفروش رو پیدا کن. نمیدونی مشکل از الگویته، از دیتای ورودیه، یا اصلاً یه بکاسلش () رو جا انداختی. دقیقاً به همین خاطره که میگم یه تستر آنلاین رجکس، نه یه ابزار «خوب»، بلکه یه ابزار «ضروری» برای هر برنامهنویسه. این ابزارها مثل یه زمین بازی امن و یه معلم خصوصی همیشه همراهن. بذار بهت بگم چرا:
صرفهجویی در زمان: دیباگ کردن در لحظه به جای تست در محیط کد
این بزرگترین دلیل منه. به جای اون چرخه عذابآور “تست-شکست-اصلاح-تست دوباره” توی محیط اصلی کد، تستر آنلاین مثل یه زمین بازی (Sandbox) عمل میکنه.
تو همون لحظه که داری الگوت رو تایپ میکنی، میبینی کجای الگوی تو با متن نمونهات مچ (Match) میشه و کجا نمیشه. رنگیرنگی بهت نشون میده، هایلایت میکنه. دیگه خبری از اون اتلاف وقتهای ۱۰ دقیقهای برای فهمیدن اینکه چرا یه + به جای * گذاشتی، نیست. همونجا، در لحظه، میفهمی و اصلاح میکنی.
یادگیری تعاملی: درک بصری الگوهای پیچیده و منطق موتور رجکس
خیلی از تسترهای مدرن (مثل Regex101 که خودم عاشقشم) یه قابلیت بینظیر دارن: “Explanation” یا توضیح قدم به قدم.
اونا الگوی پیچیدهی تو رو میشکنن به تیکههای کوچیک و به زبون آدمیزاد (!) توضیح میدن که هر بخش دقیقاً داره چیکار میکنه. مثلاً میگه:
^ : شروع رشته رو بررسی میکنه.
([A-Z]) : گروه اول، دنبال یه حرف بزرگ میگرده.
d+ : دنبال یک یا چند عدد پشت سر هم میگرده.
این دقیقاً مثل این میمونه که یه معلم خصوصی کاربلد کنار دستت نشسته باشه و بهت بگه موتور رجکس چطوری داره فکر میکنه. این بهترین و سریعترین روش برای یادگیری عمیق رجکسه.
جلوگیری از خطاهای فاجعهبار (مانند ReDoS) با تحلیل الگو (تجربه)
این یکی رو بذار با یه خاطره تلخ (اما آموزنده) بگم. سالها پیش، ما یه الگوی رجکس برای اعتبارسنجی یه فیلد ورودی کاربر داشتیم. الگو روی سیستم ما و با تستهای معمولی عالی کار میکرد. اما نمیدونستیم که الگو یه مشکل فاجعهبار به اسم “Catastrophic Backtracking” داره.
یه روز، یه کاربر (شاید هم یه هکر) یه متن خاص و به ظاهر ساده رو وارد کرد و… بوم!
سرور ما برای چند دقیقه کاملاً قفل شد. CPU رفت روی ۱۰۰٪ و کل اپلیکیشن از دسترس خارج شد. این دقیقاً همون حمله ReDoS (انکار سرویس با عبارت باقاعده) بود.
اگه اون موقع از یه تستر آنلاین درستحسابی استفاده کرده بودیم، همون لحظه بهمون هشدار میداد که این الگو «ناامن»ـه و مستعد ReDoSـه. این ابزارها الگوی تو رو تحلیل میکنن و قبل از اینکه فاجعه اتفاق بیفته، بهت اخطار میدن. این تجربه رو هیچوقت فراموش نمیکنم و حالا قبل از هر کامیت (Commit)، اول الگوم رو توی تستر چک میکنم.
اطمینان از سازگاری الگو با طعمهای مختلف (Flavors)
یه نکتهای که خیلیها بهش توجه نمیکنن: رجکس یه استاندارد واحد و جهانی نداره! «طعم» (Flavor) رجکسی که توی پایتون (Python) کار میکنه، ممکنه دقیقاً همونجوری توی جاوااسکریپت (JavaScript) یا PHP (PCRE) یا Go کار نکنه.
تفاوتها شاید کوچیک باشن (مثلاً توی نحوه کار Lookaroundها یا گروههای نامگذاری شده)، اما همون تفاوت کوچیک کافیه تا الگوی تو توی محیط پروداکشن شکست بخوره.
تسترهای آنلاین خوب، بهت اجازه میدن دقیقاً انتخاب کنی که داری برای چه موتوری (چه طعمی) الگو مینویسی. اینطوری مطمئن میشی الگویی که نوشتی، دقیقاً همونجایی که قراره استفاده بشه، درست کار میکنه و از سورپرایزهای ناخوشایند جلوگیری میکنی.
معرفی جامع Regex101: انتخاب اول حرفهایها (استاندارد طلایی)
بریم ببینیم چه چیزی Regex101 رو انقدر خاص و تبدیل به استاندارد طلایی کرده.
تحلیل و توضیح کامل الگو (Regex Explanation): درک قدمبهقدم منطق
این همون قابلیتیه که تو بخش قبلی بهش اشاره کردم و Regex101 استاد این کاره. یادت باشه گفتم مثل یه معلم خصوصیه؟ دقیقاً!
تو هر الگویی که مینویسی، هرچقدر هم پیچیده و تو در تو، این ابزار تو یه کادر جداگونه، قدم به قدم، به زبون ساده برات «ترجمه» میکنه. میگه این ( برای شروع یه گروه بود، این ?: یعنی این گروه رو «کپچر» نکن، این + یعنی یکی یا بیشتر… .
این قابلیت بهتنهایی نصف فرایند یادگیری رجکس رو برای من جلو انداخت. تو دیگه با یه الگوی ترسناک و یکخطی مواجه نیستی؛ داری یه «دستورالعمل» قدم به قدم رو میخونی.
پشتیبانی از طعمهای مختلف (Flavors): PCRE، پایتون، جاوااسکریپت، Go و…
این همون فاجعهی «روی سیستم من کار میکرد!» خودمونه. تو برنامهنویسی هیچی بدتر از تفاوتهای کوچیک و پنهان بین محیطهای مختلف نیست. Regex101 این مشکل رو ریشهای حل کرده.
قبل از اینکه شروع کنی، تو یه منوی کشویی خیلی شیک ازت میپرسه: «خب، این الگو رو برای کجا میخوای؟»
PCRE (برای PHP، آپاچی و…)؟
Python؟
JavaScript (هم کلاینت، هم نود)؟
Go؟
.NET (سیشارپ)؟
تو «طعم» مورد نظرت رو انتخاب میکنی و خلاص! ابزار خودش رو با تمام قواعد و محدودیتهای اون موتور خاص تطبیق میده. این یعنی «اطمینان» خالص. یعنی الگویی که اینجا تست کردی، دقیقاً همونجوری توی کد اصلیت کار میکنه.
کتابخانه جامع الگوهای آماده (Community Library)
بعضی وقتا واقعاً حوصله نداری چرخ رو از اول اختراع کنی، مگه نه؟ مثلاً میخوای یه الگو برای پیدا کردن آدرس ایمیل، URL، یا یه تاریخ با فرمت خاص پیدا کنی.
Regex101 یه کتابخونه عظیم داره که خود کاربرها الگوهای مفیدشون رو اونجا به اشتراک گذاشتن. تو فقط کافیه جستجو کنی. بارها برای من پیش اومده که برای یه الگوی پیچیده گیر کردم، رفتم تو کتابخونه یه جستجو زدم و دیدم یه نفر قبلاً یه الگوی خیلی بهینهتر و تمیزتر از چیزی که خودم تو ذهن داشتم رو اونجا گذاشته. این یعنی صرفهجویی در زمان، به معنای واقعی کلمه.
برگهی تقلب داخلی (Quick Reference / Cheat Sheet)
حتی حرفهایترین آدمها هم همهی سینتکسها رو حفظ نیستن. مثلاً تفاوت دقیق b (مرز کلمه) با B (نبودن مرز کلمه) چیه؟ یا سینتکس Lookbehind چطور نوشته میشد؟
به جای اینکه هر بار یه تب جدید باز کنی و بری تو گوگل سرچ کنی، خود Regex101 یه «برگه تقلب» یا Quick Reference کامل و جمعوجور همون بغل دستت داره. هر چی لازم داری همونجاست. این به تمرکزت کمک میکنه و تو رو از محیط تست خارج نمیکنه.
ابزار تولید کد (Code Generator) برای زبانهای مختلف
و اما تیر خلاص! این قابلیت دیگه آخر راهه. تو الگوت رو نوشتی، تست کردی، از درست بودنش مطمئن شدی، «طعم» رو هم درست انتخاب کردی… حالا چی؟
حالا میزنی روی دکمه «Code Generator». این ابزار، الگوی رجکس تو رو میگیره و کد آمادهی استفاده برای زبان برنامهنویسی که انتخاب کردی بهت میده! مثلاً برای پایتون بهت کد re.compile(…) رو میده، یا برای جاوااسکریپت کد new RegExp(…) رو تحویل میده.
این یعنی دیگه حتی لازم نیست نگران نحوه «فرار» دادن (Escape کردن) بکاسلشها یا کوتیشنها توی رشتهی کد باشی. خود ابزار همهی این کارها رو برات انجام میده. فقط کپی میکنی و میذاری توی کدت. واقعاً از این راحتتر میشه؟
برترین جایگزینهای Regex101: معرفی Regexr و Debuggex
Regexr: رابط کاربری ساده، تمرکز بر آموزش و مثالهای تعاملی
اگه Regex101 برات مثل کابین خلبان هواپیمای ۷۴۷ میمونه (با کلی دکمه و آپشن!)، Regexr مثل یه ماشین خوشفرمون و جمعوجوره.
اولین چیزی که تو Regexr عاشقش میشی، رابط کاربری (UI) فوقالعاده تمیز، ساده و مدرنشه. همهچیز جلوی چشمته و اصلاً گیجکننده نیست.
اما نقطه قوت اصلیش برای من، تمرکزش روی آموزشه. وقتی داری الگوت رو مینویسی، اگه موس رو روی هر بخش از الگو نگه داری، یه پنجرهی کوچیک و خوشگل باز میشه که دقیقاً توضیح میده اون تیکه (مثلاً s یا *?) داره چیکار میکنه. علاوه بر این، یه بخش “Cheatsheet” عالی و دمدستی داره که خیلی بصری و قشنگه.
اگه تازهکارتر باشی یا بخوای یه چیزی رو سریع یاد بگیری و همونموقع تست کنی، Regexr حس خیلی خوبی بهت میده.
Debuggex: ابزار بصری (Visual) برای نمایش دیاگرام الگوهای پیچیده
خب، حالا برسیم به یه ابزار «متفاوت». Debuggex اصلاً شبیه بقیه نیست.
تا حالا برات پیش اومده که به یه الگوی رجکس طولانی (مثلاً ۷-۸ خطی که از یه جای دیگه کپی کردی) زل بزنی و بگی… «این دیگه چیه؟!» … دقیقاًمثلیهمشتسیمدرهمپیچیدهاستکهنمیدونیسروتهشکجاست.
اینجا Debuggex وارد میشه. این ابزار، اون الگوی متنی درهمپیچیده رو میگیره و… اون رو به یه «دیاگرام بصری» یا فلوچارت تبدیل میکنه!
یهو چشمات باز میشه. میتونی «مسیر» حرکت موتور رجکس رو ببینی. میبینی که الگو کجاها انشعاب پیدا میکنه (همون | ها)، کجاها حلقه داره (همون * و + ها) و چطوری گروهها (()) تو دل هم قرار گرفتن.
این ابزار برای «دیباگ کردن» و «فهمیدن» الگوهای پیچیدهی دیگران معرکه است. شاید برای نوشتن از صفر انتخاب اولت نباشه، ولی برای باز کردن گرههای کور، هیچچی جاش رو نمیگیره.
RegEx Pal: ابزار کلاسیک و سریع برای تستهای فوری و ساده
و در آخر، یه ابزار «نوستالژی» و «کارراهانداز».
RegEx Pal قشنگ نیست. امکانات خفن Regex101 رو نداره. دیاگرام هم بهت نمیده. پس به چه دردی میخوره؟ سرعت!
این ابزار، مثل «نوتپد» ویندوز میمونه. یه صفحهی سادهاس که توش نه خبری از طعم (Flavor) هست، نه تولید کد، نه هیچی. فقط دو تا کادر داره: «الگوی تو» و «متن تو».
برای کی خوبه؟ برای وقتایی که توی یه جلسه کدی، یا داری سریع یه چیزی رو چک میکنی و اصلاً حوصله لود شدن اون غولهای همهکاره رو نداری. میخوای فقط ببینی a(b|c) با ac مچ میشه یا نه. همین! سریع، سبک، بدون هیچ زرق و برقی. گاهی وقتا، همین سادگیه که کار آدم رو راه میندازه.
خلاصه که آره، Regex101 پادشاهه، ولی این سهتا هم شاهزادههای کاربلدی هستن که هرکدوم تو یه موقعیت خاص به دردت میخورن.
چگونه از یک تستر رجکس به صورت حرفهای استفاده کنیم؟ (راهنمای گام به گام)
گام اول: انتخاب Flavor صحیح (مهمترین قدم)
اینو دارم با فونت درشت بهت میگم چون مهمترین قدمه و ۹۰٪ خطاهای عجیب و غریب از همینجا شروع میشه.
یادته گفتم رجکس «طعم» (Flavor) داره؟ یعنی رجکسی که توی PHP (با موتور PCRE) مینویسی، ممکنه یه کوچولو با رجکسی که توی جاوااسکریپت (JavaScript) یا پایتون (Python) مینویسی فرق کنه.
اولین کاری که قبل از تایپ کردنِ حتی یه دونه کاراکتر باید بکنی اینه که بری و از توی تنظیمات تستر (مثلاً تو Regex101، همون نوار سمت چپ) «طعم» درست رو انتخاب کنی.
اگه این کارو نکنی، مثل این میمونه که داری با دستور پخت کیک ایتالیایی، یه غذای ژاپنی درست میکنی! ممکنه الگوت توی تستر عالی کار کنه، ولی وقتی میبریش تو کد اصلیت (مثلاً Node.js)، یهو از کار بیفته. چرا؟ چون داشتی با طعم PCRE تست میکردی، در حالی که باید روی طعم JavaScript تست میکردی. پس… اول «طعم»!
گام دوم: وارد کردن رشتههای تست جامع (شامل موارد مثبت و منفی)
اینجا فرق یه تست سرسری با یه تست حرفهای معلوم میشه.
تست مثبت (Positive Case): این همون دیتاییه که تو انتظار داری الگوت اون رو «پیدا کنه» (Match بشه). مثلاً اگه داری ایمیل رو اعتبارسنجی میکنی، چند تا ایمیل درست (مثل test.me@gmail.com یا info@vazir.io) وارد میکنی.
تست منفی (Negative Case): این مهمتره! دیتایی که الگوی تو «نباید» اون رو پیدا کنه.
برای همون مثال ایمیل، باید اینا رو هم تست کنی:
just-a-text (بدون @)
test@domain (بدون .com یا .io)
@test.com (بدون نام کاربری)
test@.com (بدون دامنه)
اگه الگوی تو هرکدوم از این موارد منفی رو «سبز» کرد و گفت مچ شده، یعنی کارت ایراد داره! الگوی تو زیادی «حریص» (Greedy) یا زیادی «سادهانگار» (Permissive)ـه. یه تستر حرفهای، الگوش رو با تستهای منفی بمباران میکنه تا مطمئن بشه دقیقاً همون چیزی رو که میخواد میگیره، نه بیشتر و نه کمتر.
گام سوم: تحلیل بخش «Explanation» برای درک منطق موتور
این بخش «توضیحات» (Explanation) که تو Regex101 هست، حکم همون معلم خصوصی رو داره.
فقط به هایلایت سبز و آبی روی متن تست نگاه نکن! برو اون کادر توضیحات رو بخون. ببین ابزار داره بهت چی میگه. آیا دقیقاً همون چیزی رو که تو تو ذهنت داشتی داره اجرا میکنه؟
خیلی وقتا من یه الگو نوشتم و کار هم کرده، اما وقتی توضیحاتش رو خوندم، فهمیدم موتور رجکس از یه مسیری که اصلاً فکرش رو هم نمیکردم به اون جواب رسیده! این یعنی الگوی من «شانسی» کار کرده و احتمالاً شکننده است. خوندن این بخش بهت کمک میکنه منطق الگوت رو «تصحیح» کنی و بفهمی پشت پرده چه خبره.
گام چهارم: بررسی هایلایت گروههای Capture شده
خیلی وقتا، ما فقط نمیخوایم بدونیم یه چیزی «مچ» شد یا نه؛ ما میخوایم یه تیکهای از اون متن رو «بکِشیم بیرون» (Extract کنیم). این کار رو با «گروههای کپچر» (Capture Groups) یعنی همون پرانتزها () انجام میدیم.
وقتی الگوت رو نوشتی، حتماً برو تو بخش «Match Information». ببین گروههای ۱، ۲، ۳ و… دقیقاً چی رو گرفتن؟
مثلاً اگه الگوت (user)@gmail.com هست و متن تست user@gmail.com باشه، باید چک کنی که «گروه ۱» دقیقاً کلمه user رو گرفته باشه. اگه user@ رو گرفته باشه، یعنی الگوت ایراد داره. این گروهها همون خروجی نهایی تو توی کد هستن، پس باید ۱۰۰٪ مطمئن باشی که چیز اضافه یا کمتری رو «کپچر» نمیکنن.
گام پنجم: استفاده از ابزار دیباگر (Debugger) برای الگوهای پیچیده
و اما میرسیم به ابزار سنگینوزنها!
گاهی وقتا الگوت خیلی پیچیده میشه. مثلاً یه عالمه گروه تو در تو و شرط و Lookaround داری. الگوت هم یا اصلاً مچ نمیشه، یا یه چیز عجیب و غریبی رو مچ میکنه که اصلاً نمیفهمی چرا!
اینجاست که باید دکمه «Regex Debugger» (توی Regex101 معمولاً یه آیکون شبیه حشره داره) روبزنی.
این ابزار، اجرای الگوی تو روی متن رو برات «سینهخیز» یا «قدم به قدم» نشون میده. مثل یه اسلوموشن (Slow Motion) از مغز موتور رجکسه. بهت میگه:
۱. «خب، دارم دنبال a میگردم… پیدا شد.»
۲. «حالا میرم سراغ b… اِ، اینجا c بود، پس نشد.»
۳. «برمیگردم عقب (Backtrack)…»
استفاده از دیباگر برای فهمیدن فرایند «عقبگرد» (Backtracking) که قلب تپنده رجکسه، حیاتیه. هر وقت گیج شدی که «چرا این الگو کار نمیکنه؟»، دیباگر مثل یه نقشه راه، دقیقاً بهت نشون میده کجای مسیر رو اشتباه رفتی.
جمعبندی: کدام ابزار تست Regex برای شما مناسبتر است؟
Regex101: برای تحلیل عمیق، دیباگ و سازگاری
اگه کارت جدیه، اگه داری برای کد پروداکشن الگو مینویسی، یا اگه با یه الگوی پیچیده گیر کردی و نیاز به دیباگ قدمبهقدم داری، Regex101 انتخاب اول و آخرته.
اون قابلیت انتخاب «طعم» (Flavor) مطمئنت میکنه که الگوت توی پایتون یا جاوااسکریپت دقیقاً همونجوری کار میکنه که انتظار داری (سازگاری). و بخش «Explanation» و «Debugger»ـش برای تحلیل عمیق و پیدا کردن ایرادهای ریز، هیچ رقیبی نداره. این ابزارِ حرفهایها برای کارهای حساس و مهمه.
Regexr: برای یادگیری و تستهای سریع
اگه هنوز داری با رجکس کلنجار میری و میخوای یاد بگیری، یا فقط میخوای یه تست سریع انجام بدی، Regexr مثل یه دوست صبور و خوشسلیقهاس.
رابط کاربریش فوقالعاده تمیز و قشنگه. برگهی تقلب (Cheatsheet) تعاملی و توضیحات شناورش (Hover) باعث میشه فرایند یادگیری خیلی شیرین بشه. برای کارهای روزمره و تستهای فوری که نمیخوای درگیر پیچیدگیهای Regex101 بشی، این ابزار عالیه.
Debuggex: برای درک الگوهای تو در تو و پیچیده
و اما Debuggex! این ابزار متخصص گرههای کوره.
وقتی به یه الگوی رجکس غولپیکر و تو در تو (Nested) برمیخوری که یکی دیگه نوشته—از اونایی که شبیه یه خط اسپاگتی در هم تنیده است—و اصلاً نمیفهمی چی به چیه، Debuggex نجاتت میده.
این ابزار الگو رو میگیره و به یه دیاگرام بصری (فلوچارت) تبدیل میکنه. یهو میفهمی که آهان! این گروه تو دل اون گروهه و این انشعاب (|) به کجاها میره. برای درک الگوهای پیچیده دیگران، هیچچی بهتر از این نیست.