مختبر التعبيرات النمطية (Regex)
اكتب النمط، وحدّد الأعلام التي تحتاجها، والصق نصًا: تُميَّز كل مطابقة أثناء الكتابة وتظهر في قائمة مع موضعها ومجموعات الالتقاط الخاصة بها. يعمل النمط على محرك التعبيرات النمطية في JavaScript الخاص بمتصفحك، لذا تطابق النتائج ما يحدث في شيفرتك، ويبقى النص على جهازك.
0 حرف · 0 كلمة · 0 سطر
تظهر المطابقات هنا مظللة.0 حرف · 0 كلمة · 0 سطر
تعمل الأداة بالكامل داخل تبويب المتصفح هذا. لا يتم رفع نصك ولا حفظه.
رموز Regex في JavaScript
نُتج عمود أول مطابقة بتشغيل كل نمط على نصه بمحرك JavaScript الذي بنى هذه الصفحة.
| الرمز | المعنى | النمط | النص | أول مطابقة |
|---|---|---|---|---|
\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 |
(?=…) | يليه (نظرة أمامية) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | لا يسبقه (نظرة خلفية سالبة) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | أي حرف Unicode (يتطلب u) | /\p{L}+/u | naïve 東京 | naïve |
الأعلام الستة وما يغيّره كل منها
g (عام) يعثر على كل التطابقات بدل التوقف عند الأول؛ وبدونه تحتوي القائمة على نتيجة واحدة. i يتجاهل حالة الأحرف. m (متعدد الأسطر) يجعل ^ و$ تطابقان بداية كل سطر ونهايته بدل بداية النص كله ونهايته فقط، وهذا ما تحتاجه لنمط مثل المسافات الزائدة في نهاية السطر. ث (dotAll، أُضيف في ES2018) يجعل . تطابق فواصل الأسطر أيضًا. u (يونيكود) يعامل النص كنقاط ترميز، فيُحسب الرمز التعبيري حرفًا واحدًا، ويفعّل رموز الخصائص مثل \p{L} لأي حرف في أي كتابة. y (لاصق) لا يطابق إلا عند الموضع الحالي تمامًا، وهو الوضع الذي تستخدمه أدوات التجزئة. تتضمن JavaScript أيضًا d لمؤشرات التطابق وv لعمليات المجموعات داخل الأصناف؛ وتقتصر هذه الأداة على الرايات الست أعلاه.
أسفل نص الاختبار يعرض كل تطابق فهرسه ومجموعاته. تأتي المجموعات المرقمة من الأقواس العادية، وتجمع (?:…) دون التقاط، بينما تنشئ (?<year>\d{4}) مجموعة مسماة تظهر باسمها، كما يوضح مثال تاريخ ISO. تُدرج قائمة الأنماط الشائعة نقاط بداية مجرّبة لعناوين البريد الإلكتروني وعناوين URL وعناوين IPv4 وألوان hex ومعرّفات UUID والكلمات المكررة والمسافات في نهاية السطر. اعتبر نمط البريد الإلكتروني فحصًا تقريبيًا لا تحققًا، فقواعد العنوان الكاملة أكثر تسامحًا بكثير، والاختبار الحقيقي الوحيد هو إرسال رسالة.
النظر إلى الخلف (Lookbehind) والتراجع الكارثي
تفحص عبارات النظر المحيط ما يحيط بموضع ما دون استهلاكه. النظر الأمامي (?=…) و(?!…) جزء من JavaScript منذ البداية؛ أما النظر الخلفي (?<=…) و(?<!…) فقد ظهر في ES2018 ووصل إلى كل المتصفحات الرئيسية عندما أطلقته Safari 16.4 في 2023. وهكذا يعثر (?<=\$)\d+ على 42 في "$42" دون تضمين علامة الدولار. وعلى خلاف محركات كثيرة أخرى، تسمح JavaScript بنظر خلفي بأي طول.
محرك JavaScript يعتمد التراجع: عندما يفشل مسار يعود ويجرب البدائل. تمنحه المحددات المتداخلة مثل (a+)+$ عددًا أسيًا من طرق تقسيم النص نفسه، فقد تستغرق سلسلة من 30 حرف a يتبعها x ثوانيَ، وبضعة أحرف إضافية قد تستغرق ساعات. هذا هو التراجع الكارثي، وعلى الخوادم يصبح ReDoS أي حجب الخدمة؛ فقد أسقطت قاعدة WAF واحدة بهذا العيب شبكة Cloudflare نحو نصف ساعة في 2 يوليو 2019. ولأن هذه الأداة تعمل داخل علامة تبويبك، فقد يجمّد مثل هذا النمط الصفحة؛ أعد تحميلها وأعد كتابة النمط بحيث لا يستطيع محددان المطالبة بالأحرف نفسها، باستخدام أصناف أضيق مثل [^,]* بدل .*، أو باستخدام المراسي. لتحرير النص نفسه بدل مطابقته راجع أدوات النصوص؛ وتجد المزيد من أدوات المطورين في مركز أدوات المطورين.
الأسئلة الشائعة
- لماذا لا يجد التعبير النمطي سوى مطابقة واحدة؟
- راية g غير مفعّلة. بدونها يتوقف المحرك بعد أول تطابق. فعّل g لعرض كل التطابقات؛ وراية y وحدها تجد عدة تطابقات أيضًا، لكن فقط عندما يتبع بعضها بعضًا مباشرة.
- هل يطابق \d الأرقام المكتوبة بأنظمة كتابة أخرى في JavaScript؟
- لا. في JavaScript يعني \d الأرقام من 0 إلى 9 فقط، و\w الأحرف اللاتينية ASCII والأرقام والشرطة السفلية فقط، حتى مع الراية u. استخدم \p{Nd} أو \p{L} مع u للكتابات الأخرى.
- هل يتصرف النمط المختبَر هنا بالطريقة نفسها في Python أو PHP؟
- تنتقل الصياغة الأساسية، لكن التفاصيل تختلف: تُكتب المجموعات المسماة في Python بالشكل
(?P<name>…)، وتدعم PHP وPython المحددات الحيازية التي تفتقر إليها JavaScript، وتتفاوت قواعد النظر الخلفي. أعد الاختبار في المحرك المستهدف. - كيف أطابق نقطة أو قوسًا بمعناهما الحرفي؟
- اسبقه بشرطة مائلة عكسية:
\.يطابق نقطة و\[يطابق قوسًا مربعًا مفتوحًا. داخل صنف الأحرف تكون معظم الرموز حرفية أصلًا، فـ[.]يطابق نقطة فقط أيضًا. - لماذا تجمّدت الصفحة أثناء كتابة النمط؟
- من المرجح أن النمط تسبب في تراجع كارثي على نصك. أعد تحميل الصفحة، ثم تجنب المحددات المتداخلة مثل
(.*)*أو(a+)+واجعل كل جزء يطابق أقل ما يمكن.