آزمایشگر Regex: ساخت و اشکالزدایی الگوها روی متن خودتان
یک عبارت منظم یک زبان کوچک برای توصیف شکل متن است. به جای اینکه بپرسید «آیا این کلمه دقیق اینجاست؟»، یک regex به شما اجازه میدهد بپرسید «آیا رشتهای وجود دارد که شبیه این به نظر برسد؟» همین چیزی است که آن را برای یافتن، اعتبارسنجی، استخراج و جایگزینی متن در ویرایشگرهای کد، فایلهای لاگ، ورودیهای فرم و اسکریپتها قدرتمند میکند. و همین چیزی است که اشتباه گرفتن را آسان میکند، چون یک الگو که در ذهنتان درست به نظر میرسد ممکن است در سکوت بیش از حد، کمتر از حد، یا اصلاً هیچ چیزی تطابق پیدا نکند.
به همین دلیل است که آزمایش تعاملی بهتر از حدس زدن است. وقتی یک الگو تایپ میکنید و تطابقها را روی متن نمونه واقعی روشن میبینید، بازخورد فوری دریافت میکنید: میبینید چه چیزی گرفته شد، چه چیزی از زیر دست رفت، و کدام گروه capture کدام قطعه را گرفت. آزمایشگر Regex ما کاملاً در مرورگر شما اجرا میشود. الگو و متن نمونه شما هرگز صفحه را ترک نمیکنند، بنابراین میتوانید خطوط لاگ، ایمیلها یا داده تولیدی را بدون ارسال به سرور الصاق کنید.

اجزای اساسی ارزش دانستن
اکثر الگوهای روزمره از مجموعه کوچکی از قطعات ساخته میشوند. اینها را یاد بگیرید و میتوانید اکثر regexهایی که در طبیعت میبینید بخوانید.
کلاسهای کاراکتر مجموعهای از کاراکترهای مجاز را توصیف میکنند. [aeiou] هر مصوت تکی را تطابق میدهد، [0-9] یک رقم را تطابق میدهد، و [a-zA-Z] یک حرف را تطابق میدهد. یک علامت ^ داخل براکتها مجموعه را نفی میکند، بنابراین [^0-9] به معنای «هر کاراکتری که رقم نباشد» است. مخففات تایپ را کمتر میکنند: \d یک رقم است، \w یک کاراکتر کلمه (حروف، ارقام، زیرخط) است، \s فاصله است، و نقطه . تقریباً هر کاراکتر تکی را تطابق میدهد.
Quantifierها میگویند قطعه قبلی چند بار ممکن است تکرار شود. * یعنی صفر یا بیشتر، + یعنی یک یا بیشتر، و ? یعنی صفر یا یک (اختیاری). برای شمارش دقیق، {3} دقیقاً سه را و {2,4} دو تا چهار را میگوید. بنابراین \d{4} یک سال چهاررقمی را تطابق میدهد و colou?r هر دو هجی را تطابق میدهد.
لنگرها یک الگو را به یک موقعیت پین میکنند نه به یک کاراکتر. ^ شروع متن را تطابق میدهد، $ انتهای آن را، و \b یک مرز کلمه را مشخص میکند. الگوی ^Error فقط خطوطی را تطابق میدهد که با «Error» شروع میشوند، و این دقیقاً همان چیزی است که هنگام اسکن لاگها میخواهید.
گروهها بخشی از الگو را در پرانتز میپیچند، هم برای اعمال یک quantifier به چند کاراکتر به طور همزمان و هم برای capture کردن متن تطابقیافته برای استفاده مجدد. در (\d{4})-(\d{2})-(\d{2}) هر گروه یک مولفه تاریخ را capture میکند که میتوانید بعداً بیرون بکشید. Alternation با pipe مثل «یا» عمل میکند: cat|dog|fish هر یک از سه کلمه را تطابق میدهد.
الگوهایی که واقعاً به آنها میرسید
چند کار تکراری بیشتر کار واقعی را پوشش میدهند. برای گرفتن چیزی شبیه ایمیل، [\w.+-]+@[\w-]+\.[\w.-]+ یک نقطه شروع عملی است؛ اعتبارسنجی کامل ایمیل بر اساس مشخصه رسمی به طرز معروفی دشوار است، و یک الگوی شل معمولاً انتخاب درست برای برجسته کردن نامزدها به جای رد کردن کاربران است.
برای اعداد، \d+ دنبالههای ارقام را میگیرد، در حالی که -?\d+(\.\d+)? منفیهای اختیاری و اعشارها را تطابق میدهد. برای حذف فاصلههای ابتدا و انتها، ^\s+|\s+$ را تطابق دهید و با هیچ چیز جایگزین کنید. برای یافتن کلمات تکراری، الگوی backreference \b(\w+)\s+\1\b یک کلمه دنبالشده توسط خودش را تطابق میدهد، جایی که \1 به اولین گروه capture شده اشاره میکند.

پرچمها نحوه رفتار تطابق را تغییر میدهند
پرچمها کلیدهایی هستند که کل الگو را اصلاح میکنند. پرچم global (g) به جای توقف در اولین مورد هر تطابقی را پیدا میکند، که وقتی میخواهید همه موارد را برجسته کنید همان چیزی است که نیاز دارید. پرچم case-insensitive (i) باعث میشود error با «Error» و «ERROR» هم تطابق داشته باشد. پرچم multiline (m) ^ و $ را تغییر میدهد تا در ابتدا و انتهای هر خط تطابق پیدا کنند، نه فقط کل متن، که برای کار خط به خط با لاگ ضروری است. سایر پرچمهای مفید شامل s (dotall، اجازه میدهد نقطه با خطوط جدید تطابق پیدا کند) و u برای مدیریت کامل یونیکد هستند.
گویشها کمی بر اساس زبان متفاوتند
Regex یک خانواده از لهجههاست، نه یک استاندارد ثابت. JavaScript، Python، PCRE (PHP)، Java، .NET، Go و Rust روی نحو اصلی فوق توافق دارند، اما در لبهها متفاوتند: پشتیبانی lookbehind، نحو گروههای نامگذاریشده ((?<name>...) در مقابل (?P<name>...))، فرار از ویژگیهای یونیکد، و اینکه کدام پرچمها وجود دارند همه متفاوتند. یک الگویی که در یک موتور کار میکند ممکن است در موتور دیگری به یک تعدیل کوچک نیاز داشته باشد، بنابراین ارزش دارد در مقابل گویشی که واقعاً با آن حمل میکنید آزمایش کنید. وقتی یک الگو را تنظیم کردید، سایر ابزارهای توسعهدهنده و ابزارهای متنی ما میتوانند با کار پیرامونی تمیز کردن، رمزگذاری و تبدیل دادهای که تازه تطابق دادید کمک کنند.
پرسشهای متداول
آیا متن من به سرور ارسال میشود؟
خیر. آزمایشگر Regex کاملاً در مرورگر شما اجرا میشود. الگو و متن نمونه شما روی دستگاه شما میمانند و هرگز آپلود نمیشوند، بنابراین الصاق داده حساس ایمن است.
این ابزار از کدام گویش regex استفاده میکند؟
از موتور regex JavaScript داخل مرورگر شما استفاده میکند. نحو اصلی با آنچه از اکثر زبانها میدانید مطابقت دارد، اگرچه برخی ویژگیهای پیشرفته کمی با PCRE، Python یا .NET متفاوتند.
تفاوت تطابق حریص و تنبل چیست؟
به طور پیشفرض quantifierها حریص هستند و تا جایی که ممکن است متن میگیرند. اضافه کردن یک علامت سوال آنها را تنبل میکند، بنابراین تا جایی که ممکن است کم میگیرند. برای مثال، الگوی ستاره نقطه حریص است در حالی که ستاره نقطه علامت سوال تنبل است.
چگونه یک کاراکتر خاص تحتاللفظی را تطابق دهم؟
آن را با یک backslash escape کنید. برای تطابق یک نقطه واقعی، backslash نقطه بنویسید. همین برای سایر متاکاراکترها مثل پرانتزها، براکتها، علامت + و علامت سوال صدق میکند.
چرا الگوی من هیچ چیزی تطابق نمیدهد؟
علل رایج عبارتند از: نبود پرچم global، لنگرهایی که تطابق را به موقعیت اشتباهی پین میکنند، یک کاراکتر خاص escapeنشده، یا quantifierهای حریص که از مرزی که انتظار داشتید عبور میکنند. قطعه به قطعه آزمایش کنید تا مقصر را پیدا کنید.
آیا میتوانم بخشهایی از تطابق را capture کنم؟
بله. یک بخش از الگو را در پرانتز بپیچید تا یک گروه capture ایجاد کنید. هر گروه جداگانه گزارش میشود، که به شما اجازه میدهد فیلدهایی مثل سال، ماه و روز را از یک تاریخ استخراج کنید.
