تستکنندهٔ Regex
الگو را بنویسید، پرچمهای لازم را علامت بزنید و متنی را بچسبانید: هر تطابق همزمان با تایپ شما هایلایت میشود و همراه با موقعیت و گروههای گیرندهاش فهرست میشود. الگو با موتور regex جاوااسکریپتِ خود مرورگر شما اجرا میشود؛ بنابراین نتایج با کد شما یکسان است و متن روی دستگاه شما میماند.
۰ نویسه · ۰ واژه · ۰ خط
تطابقها اینجا هایلایت میشوند.۰ نویسه · ۰ واژه · ۰ خط
کاملاً در همین زبانهٔ مرورگر اجرا میشود. متن شما هرگز آپلود یا ذخیره نمیشود.
توکنهای regex در جاوااسکریپت
ستون اولین تطابق با اجرای هر الگو روی متنش در موتور جاوااسکریپتی که این صفحه را ساخته تولید شده است.
| توکن | معنی | الگو | متن | اولین تطابق |
|---|---|---|---|---|
\d | رقم 0–9 | /\d+/ | Order 66 shipped | 66 |
\w | حرف، رقم یا زیرخط (ASCII) | /\w+/ | snake_case-id | snake_case |
\s | فضای خالی، شامل تب و شکست خط | /\s+/ | two spaces | |
. | هر نویسه بهجز شکست خط (مگر با s) | /a.c/ | abc a-c | abc |
^ $ | ابتدا و انتهای ورودی (یا خط، با m) | /^\w+$/ | single | single |
[abc] | یکی از نویسههای فهرستشده | /[aeiou]/ | rhythm and blues | a |
[^abc] | هر نویسهای که فهرست نشده | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0 یا بیشتر، 1 یا بیشتر، 0 یا 1 | /colou?r/ | color colour | color |
{n,m} | بین n و m بار | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | گروه ضبطکننده | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | گروه ضبطکنندهٔ نامدار | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | گروه بدون ضبط | /(?:ab)+/ | ababab! | ababab |
a|b | هر یک از دو طرف | /cat|dog/ | hotdog | dog |
\b | مرز واژه | /\bcat\b/ | concat cat | cat |
(?=…) | پس از آن بیاید (lookahead) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | پیش از آن نیامده باشد (negative lookbehind) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | هر حرف یونیکد (نیازمند u) | /\p{L}+/u | naïve 東京 | naïve |
شش پرچم و تأثیر هر کدام
g (سراسری) بهجای توقف در اولین تطابق، همهٔ تطابقها را پیدا میکند؛ بدون آن فهرست فقط یک مورد دارد. i تفاوت حروف بزرگ و کوچک را نادیده میگیرد. m (چندخطی) باعث میشود ^ و $ در ابتدا و انتهای هر خط تطابق پیدا کنند، نه فقط در ابتدا و انتهای کل متن؛ برای الگویی مثل فاصلههای انتهای خط همین را لازم دارید. s (dotAll، افزودهشده در ES2018) اجازه میدهد . شکست خط را هم بپذیرد. u (یونیکد) متن را بهصورت کدپوینت در نظر میگیرد، پس یک ایموجی یک نویسه حساب میشود، و escapeهای ویژگی مانند \p{L} را برای هر حرف در هر خطی فعال میکند. y (چسبنده) فقط دقیقاً در موقعیت فعلی تطابق میدهد؛ حالتی که توکنایزرها استفاده میکنند. جاوااسکریپت d را هم برای اندیس تطابقها و v را برای عملیات مجموعهای در کلاسها دارد؛ این ابزار فقط همین شش پرچم بالا را پشتیبانی میکند.
زیر متن آزمایشی، برای هر تطابق اندیس و گروههایش نمایش داده میشود. گروههای شمارهدار از پرانتزهای ساده میآیند، (?:…) گروه بدون ثبت است و (?<year>\d{4}) گروه نامدار میسازد که با نام نمایش داده میشود، همانطور که نمونهٔ تاریخ ISO نشان میدهد. منوی الگوهای رایج نقطههای شروع آزمایششدهای برای نشانی ایمیل، URL، نشانی IPv4، رنگ هگز، UUID، کلمات تکراری و فاصلههای انتهای خط درج میکند. الگوی ایمیل را فقط یک بررسی سرسری بدانید، نه اعتبارسنجی: دستور زبان کامل نشانی ایمیل بسیار آزادتر است و تنها آزمون واقعی ارسال یک پیام است.
Lookbehind و بازگشت فاجعهبار (Catastrophic Backtracking)
Lookaroundها محیط اطراف یک موقعیت را بدون مصرف کردن نویسهها بررسی میکنند. Lookahead یعنی (?=…) و (?!…) همیشه در جاوااسکریپت بوده است؛ lookbehind یعنی (?<=…) و (?<!…) در ES2018 آمد و با عرضهٔ Safari 16.4 در سال 2023 به همهٔ مرورگرهای اصلی رسید. پس (?<=\$)\d+ در «$42» عدد 42 را بدون علامت دلار پیدا میکند. برخلاف بسیاری از موتورهای دیگر، جاوااسکریپت lookbehind با هر طولی را مجاز میداند.
موتور جاوااسکریپت از نوع backtracking است: وقتی مسیری شکست میخورد، برمیگردد و گزینههای دیگر را امتحان میکند. چندکنندههای تودرتو مانند (a+)+$ تعداد نمایی راه برای تقسیم همان متن به آن میدهند؛ بنابراین رشتهای از 30 حرف a بههمراه x در انتها میتواند چند ثانیه طول بکشد و چند حرف بیشتر ممکن است ساعتها زمان ببرد. این پدیده catastrophic backtracking است و روی سرورها به ReDoS، یعنی حملهٔ منع سرویس، تبدیل میشود؛ یک قانون WAF با همین ایراد در 2 ژوئیهٔ 2019 شبکهٔ Cloudflare را حدود نیم ساعت از کار انداخت. چون این ابزار در تب شما اجرا میشود، چنین الگویی میتواند صفحه را قفل کند؛ صفحه را دوباره بارگذاری کنید و الگو را طوری بنویسید که هیچ دو چندکنندهای نتوانند روی نویسههای یکسان ادعا کنند، با کلاسهای دقیقتر مانند [^,]* بهجای .* یا با لنگرها. برای ویرایش خود متن، نه تطابق آن، ابزارهای متن را ببینید؛ ابزارهای بیشتر برنامهنویسی در بخش ابزارهای توسعهدهندگان هستند.
پرسشهای متداول
- چرا regex من فقط یک تطابق پیدا میکند؟
- پرچم g خاموش است. بدون آن، موتور بعد از اولین تطابق متوقف میشود. g را فعال کنید تا همهٔ موارد فهرست شوند؛ پرچم y بهتنهایی هم چند مورد پیدا میکند، اما فقط وقتی که مستقیماً پشت سر هم باشند.
- آیا \d در جاوااسکریپت ارقام خطهای دیگر را هم تطابق میدهد؟
- خیر. در جاوااسکریپت \d فقط 0 تا 9 را شامل میشود و \w فقط حروف ASCII، ارقام و زیرخط را، حتی با پرچم u. برای خطهای دیگر از \p{Nd} یا \p{L} همراه با u استفاده کنید.
- آیا الگویی که اینجا تست شده در Python یا PHP هم همینطور رفتار میکند؟
- نحو پایه منتقل میشود، اما جزئیات فرق دارد: گروههای نامدار در پایتون به شکل
(?P<name>…)نوشته میشوند، PHP و پایتون چندکنندههای possessive را دارند که جاوااسکریپت ندارد و قواعد lookbehind هم متفاوت است. الگو را در موتور مقصد دوباره آزمایش کنید. - چطور یک نقطه یا براکت را بهصورت حرفی تطابق دهم؟
- با بکاسلش escape کنید:
\.یک نقطه و\[یک کروشهٔ باز را تطابق میدهد. داخل کلاس نویسه بیشتر نمادها از قبل تحتاللفظیاند، پس[.]هم فقط یک نقطه را تطابق میدهد. - چرا هنگام تایپ الگو صفحه از کار افتاد و قفل شد؟
- احتمالاً الگو روی متن شما catastrophic backtracking ایجاد کرده است. صفحه را دوباره بارگذاری کنید، سپس از چندکنندههای تودرتو مانند
(.*)*یا(a+)+پرهیز کنید و هر بخش را طوری بنویسید که کمترین مقدار ممکن را تطابق دهد.