نحوهٔ استفاده از تستکنندهٔ Regex
- الگوی خود را بین دو اسلش وارد کنید، بدون
/ اطراف آن. - فلگهایی مانند
g (همهٔ تطابقها)، i (نادیده گرفتن حروف بزرگ/کوچک) و m (چندخطی) را فعال یا غیرفعال کنید. - متن آزمایشی خود را جایگذاری کنید. تطابقها در سمت چپ برجسته و در پایین با اندیس و گروههای گیرنده فهرست میشوند.
- جایگزینی را فعال کنید و عبارتی مانند
$1 یا $<name> وارد کنید تا String.replace را پیشنمایش کنید. - از کتابخانهٔ الگوها یک الگو انتخاب کنید تا با یک regex آزمودهشده برای ایمیل، URL، IP یا تاریخ شروع کنید.
عبارتهای منظم در JavaScript
این تستکننده از موتور RegExp خود مرورگر شما استفاده میکند، بنابراین نتایج دقیقاً همان چیزی است که String.match، matchAll، replace و RegExp.exec در JavaScript و Node.js برمیگردانند. این شامل سینتکس مدرن هم میشود: گروههای نامدار (?<name>…)، lookbehind (?<=…)، escapeهای ویژگی یونیکد مانند \p{L} با فلگ u و اندیس تطابقها با فلگ d.
فلگها چه میکنند
| فلگ | نام | اثر |
g | global | همهٔ تطابقها را پیدا میکند، بهجای توقف در اولین. |
i | ignoreCase | حروف صرفنظر از بزرگ یا کوچک بودن تطبیق مییابند. |
m | multiline | ^ و $ در ابتدا و انتهای هر خط تطبیق مییابند. |
s | dotAll | . با شکست خط هم تطبیق مییابد. |
u | unicode | الگو را بهصورت نقاط کد در نظر میگیرد؛ \p{…} و \u{…} را فعال میکند. |
y | sticky | فقط در موقعیت فعلی lastIndex تطبیق میدهد. |
d | hasIndices | موقعیت شروع و پایان هر گروه گیرنده را گزارش میکند. |
محافظت در برابر بکترکینگ فاجعهبار
الگوهایی با کمیتسنجهای تودرتو، مانند (a+)+$ یا (\w|\d)*x، روی ورودیهایی که تقریباً تطبیق مییابند ممکن است زمان نمایی بگیرند. در یک صفحهٔ وب معمولی این کار تب را منجمد میکند. اینجا هر تطابق در یک Web Worker پسزمینه اجرا میشود که پس از یک ثانیه متوقف میشود و بهجای مرورگر قفلشده یک هشدار واضح میگیرید. همین الگو در کد production میتواند یک آسیبپذیری ReDoS باشد، پس هشدار را باگی بدانید که باید رفع شود.
نکاتی برای نوشتن regex بهتر
- هنگام اعتبارسنجی کل مقدار، الگو را با
^ و $ مهار کنید، وگرنه تطابق در هر جای رشته قبول میشود.
- کلاسهای مشخص مانند
[^"]* را به .* ترجیح دهید؛ سریعترند و از تطابق بیش از حد جلوگیری میکنند.
- وقتی به مقدار گرفتهشده نیاز ندارید، از گروههای غیرگیرنده
(?:…) استفاده کنید.
- گروههای خود را نامگذاری کنید. خواندن
match.groups.year از match[1] آسانتر است.
پرسشهای متداول
این تستکننده از کدام نوع regex استفاده میکند؟
JavaScript (ECMAScript)، از طریق RegExp داخلی مرورگر شما. بیشتر سینتکس با PCRE، Python و Java مشترک است، اما ویژگیهایی مانند کمیتسنجهای possessive، گروههای اتمی و modifierهای درونخطی مانند (?i) در JavaScript وجود ندارند.
چرا الگوی من فقط یک تطابق پیدا میکند؟
بدون فلگ g (global)، JavaScript پس از اولین تطابق متوقف میشود. برای یافتن همهٔ موارد g را فعال کنید.
چطور در متن جایگزین به گروهها ارجاع دهم؟
از $1، $2… برای گروههای شمارهدار، $<name> برای گروههای نامدار، $& برای کل تطابق و $$ برای علامت دلار واقعی استفاده کنید.
چرا تستکننده با timeout متوقف شد؟
الگو روی ورودی شما بیش از یک ثانیه طول کشید که تقریباً همیشه یعنی بکترکینگ فاجعهبار. به دنبال کمیتسنجهای تودرتو مانند (x+)+ یا گزینههای همپوشان مانند (a|a)* بگردید و آنها را طوری بازنویسی کنید که هر کاراکتر فقط به یک روش تطبیق یابد.
آیا دادههای آزمایشی من جایی ارسال میشوند؟
خیر. تطبیق بهصورت محلی در یک Web Worker داخل مرورگر شما اجرا میشود. الگو و متن شما فقط در مرورگر خودتان ذخیره میشوند تا وقتی برمیگردید هنوز آنجا باشند.