مُختبِر التعابير النمطية
اختبر تعبيرًا نمطيًا مباشرة: شاهد المطابقات ومجموعات الالتقاط، وعاين الاستبدالات، وقسّم النص — بدلالات JavaScript.
أدخل نمطًا ونصًا لرؤية النتائج
ما الذي تفعله هذه الأداة
التعبير النمطي لغة مضغوطة لوصف أنماط النص، والطريقة الموثوقة الوحيدة لكتابة تعبير هي مشاهدته وهو يعمل على نص حقيقي. هذا المُختبِر يفعل ذلك بالضبط، مباشرةً، في ثلاثة أوضاع. المطابقة تعرض كل موضع يطابق فيه النمط، مميَّزًا داخل النص، مع كل مجموعة التقاط مدرجة تحته. الاستبدال يعاين ما سينتجه String.replace، بما في ذلك المراجع $1 وlt;name>. التقسيم يعرض كيف سيقطّع String.split النص — بما في ذلك الأجزاء التي لا يتوقعها أحد تقريبًا بشكل صحيح، مثل الفواصل الملتقطة التي تظهر في النتيجة.
يعمل النمط على محرك JavaScript في متصفحك نفسه، لا على تقليد له. ما يطابق هنا هو بالضبط ما سيطابق في كود JavaScript لديك، بايتًا ببايت، لأن المحرك نفسه هو من يقوم بالعمل.
قراءة نتائج المطابقة
كل مطابقة تُميَّز في نص الاختبار وتُدرج تحته مع موضعها — إزاحتا الأحرف حيث تبدأ وتنتهي. إذا احتوى النمط على مجموعات التقاط، تظهر كل مجموعة تحت مطابقتها مع القيمة التي التقطتها. تُرقَّم المجموعات حسب قوسها الافتتاحي، من اليسار إلى اليمين، تمامًا كما يرقّمها المحرك من أجل $1 و$2 والمراجع الخلفية؛ والمجموعة المسمّاة تعرض اسمها إلى جانب رقمها. المجموعة التي لم تشارك في المطابقة — مثلًا الطرف الخاسر في تناوب — تُعلَّم بذلك بدلًا من عرضها كسلسلة فارغة، لأنهما بالنسبة إلى كودك شيئان مختلفان: undefined مقابل "".
يمكن لنمط أن يطابق صفرًا من الأحرف بشكل مشروع — فذلك ممكن مع ^ أو \b أو بديل فارغ. هذه المطابقات ذات الطول الصفري لا تميّز شيئًا، لذا تعلّم الأداة الموضع بخط رفيع بدلًا من تركك تتساءل أين ذهبت المطابقة.
الرايات
تغيّر الرايات سلوك النمط بأكمله، واثنتان منها تسببان معظم الالتباس حول التعابير النمطية:
- g (عمومي) — يعثر على كل المطابقات، لا الأولى فقط. من دونه تعرض المطابقة نتيجة واحدة ويغيّر الاستبدال ظهورًا واحدًا. وهي الراية الأكثر نسيانًا.
- i (تجاهل حالة الأحرف) — تتطابق الحروف بغضّ النظر عن حالتها.
- m (متعدد الأسطر) — يطابق ^ و$ بداية كل سطر ونهايته، لا النص كله فقط.
- s (dotAll) — تطابق النقطة أحرف الأسطر الجديدة أيضًا. من دونها تتوقف . عند كل فاصل سطر.
- u (يونيكود) — يعمل النمط بنقاط الترميز: الرموز التعبيرية وغيرها من الأحرف خارج النطاق الأساسي تتصرف بشكل صحيح، وتصبح هروبات الخصائص \p{…} متاحة.
- y (ملتصق) — يجب أن تبدأ المطابقة بالضبط حيث انتهت السابقة. مفيد للمجزّئات؛ ومفاجئ في أي مكان آخر.
- d (الفهارس) — يسجّل المحرك المواضع الدقيقة لكل مجموعة. لا يغيّر شيئًا فيما يُطابَق.
مراجع الاستبدال
لا يُؤخذ نص الاستبدال حرفيًا — حفنة من متتاليات $ تُوسَّع لكل مطابقة. تُدرج $1 حتى $9 ما التقطته المجموعات المرقّمة، ويُدرج lt;name> مجموعة مسمّاة، ويُدرج amp; المطابقة كاملة، وينتج $ علامة دولار حرفية. كل ما عدا ذلك يُنسخ كما هو.
"2026-07-20".replace(/(?<y>\d{4})-(\d{2})-(\d{2})/, "$3.$2.lt;y>")
// → "20.07.2026"سلوك في JavaScript يستحق أن يُستوعب: من دون الراية g، يغيّر replace أول ظهور فقط. ليست هذه غرابة في الأداة — بل هو ما سيفعله كودك. تعرض الأداة تلميحًا عندما تكون g معطّلة، حتى لا يبدو الاستبدال الوحيد كأنه خلل.
كيف يتصرف split فعلًا
لدى String.split مع تعبير نمطي سلوكان يفاجئان بانتظام حتى المطورين المتمرسين، ووضع التقسيم موجود إلى حد كبير لجعلهما مرئيين. أولًا: إذا احتوى النمط على مجموعات التقاط، فإن ما تلتقطه يُدرج في المصفوفة الناتجة بين القطع — تقسيم "a,b" على (,) ينتج ثلاثة أجزاء: a والفاصلة وb. ثانيًا: المطابقات في بداية النص أو نهايته تمامًا، أو مطابقتان متجاورتان، تنتج سلاسل فارغة في النتيجة — وتعرضها الأداة صراحةً بدلًا من إخفائها.
"a,b".split(/(,)/) // → ["a", ",", "b"] ",a,".split(/,/) // → ["", "a", ""]
الأنماط الجامحة تُوقَف ولا تُحتمَل
بعض الأنماط فخاخ. محدد كمي متداخل مثل (a+)+ مجرَّب على سلسلة طويلة تكاد تطابق يجبر المحرك على إعادة محاولة عدد أسّي من التوليفات قبل أن يستسلم — يسمى هذا التراجع الكارثي، وقد يجمّد تبويب المتصفح لدقائق. تشغّل هذه الأداة نمطك في خيط worker منفصل وتوقفه بعد ثانيتين: النمط الجامح يكلفك رسالة بدلًا من صفحة متجمدة. إذا رأيت تلك الرسالة، فابحث في النمط عن محددات كمية متداخلة أو بدائل متداخلة؛ والإصلاح عادةً هو ضمان ألا يستطيع التكرار الداخلي والخارجي مطابقة النص نفسه.
وكما في كل أداة على هذا الموقع، لا يغادر النمط والنص جهازك أبدًا — الـworker جزء من الصفحة، وليس خادمًا.
الأسئلة الشائعة
- ما نكهة التعابير النمطية التي يستخدمها هذا المُختبِر؟
- JavaScript (ECMAScript)، لأن النمط يعمل على محرك المتصفح نفسه. المجموعات المسمّاة وlookbehind وهروبات خصائص يونيكود \p{…} كلها تعمل كما في JavaScript الحديثة. أنماط PCRE أو Python تنتقل غالبًا كما هي، أما التراكيب التي لا تملكها JavaScript — المحددات الكمية الاستحواذية والمجموعات الذرية و\A و\z — فسترفض أو ستعني شيئًا آخر.
- لماذا يعثر نمطي على مطابقة واحدة فقط؟
- في الغالب الأعم: الراية g معطّلة. من دونها تتوقف JavaScript عند أول مطابقة، ويغيّر replace أول ظهور فقط. فعّل مربع g للبحث في النص كله.
- ماذا تعني «لم تشارك» لمجموعة؟
- المجموعة موجودة في النمط لكنها لم تُستخدم في هذه المطابقة بالذات — عادةً لأنها في الفرع الخاسر من تناوب، أو تحت محدد كمي طابق صفر مرات. في الكود قيمتها undefined، وهذا يختلف عن التقاط سلسلة فارغة، والأداة تحافظ على هذا التمييز.
- هل يُرسَل نمطي أو نصي إلى خادم؟
- لا. تجري المطابقة بالكامل في متصفحك، داخل خيط worker في الصفحة نفسها. ومهلة الأمان ذات الثانيتين تُفرض محليًا أيضًا — لا شيء مما تكتبه يغادر جهازك.