ماذا يعني «اختبار التعبير النمطي»؟
اختبار التعبير النمطي (« regex test online »، « tester regex javascript ») يعني تنفيذ نمط على نص حقيقي ومراقبة ما يعيده المحرك بالضبط: السلاسل المطابقة وموضعها وقيمة مجموعات الالتقاط. نمط «يبدو صحيحًا» لا يعني شيئًا ما لم يعمل على بياناتكم — هذا هو الفرق الوحيد بين regex في الدرس وregex في الإنتاج.
يجيب الاختبار عن ثلاثة أسئلة متمايزة. هل يوجد تطابق : جدول التطابقات يوضّح ذلك في السطر نفسه. أين وكم : يُظهر الفهرس والطول هل كانت المرساة في مكانها. ماذا يلتقط : تكشف المجموعات المرقّمة أو المُسمّاة ما إذا كانت الجزئية التي تنوي استخراجها هي المطلوبة فعلًا.
المحارف الوصفية التي تصنع الفرق كله
النقطة . تستبدل أي حرف عدا السطر الجديد — ومنه العلم s عندما يكون نصك متعدد الأسطر. عوامل التكرار *, + و ? هي جشعة : تتوقف عند أول عدد تكرارات يكفي. اللاحقة ? (*?, +?, {2,5}?) تُعكِس هذا السلوك وتمنح الـ النسخة الكسولة، التي يلزم تفضيلها دائمًا تقريبًا عندما يقوم .* بتناول نهاية السطر.
الأقواس المربعة تُعرِّف فئة: [abc] يقبل حرفًا من المدرج، [^abc] كل شيء عداها، [a-z0-9] مدى من المحارف. انتبه للنفي في بداية الفئة — [^...] للموضع الأول فقط، وإلا فإن ^ يعود حرفًا حرفيًا. وعلامة | تفصل البدائل وتتصرف كأولوية منخفضة: ^cat|dog$ تعني «كامل النص يساوي cat» أو «كامل النص يساوي dog»، لا «cat أو dog في البداية أو النهاية» — يجب حينئذٍ التجميع: ^(?:cat|dog)$.
المجموعات وlookahead وlookbehind
الأقواس تلتقط. المجموعة 1 متاحة بـ $1 في جهة الاستبدال، و \1 في جهة النمط، والمجموعات المُسمّاة بـ $<nom> و \k<nom> — أوضح بكثير منذ ثلاثة مجموعات. (?:...) تجمع دون إنشاء رقم، وهو ما يُفضَّل ما دمتم تلتقطون البنية فقط.
عمليات التنبؤ (lookaround) تتحقق دون استهلاك: (?=...) تتطلب أن يطابق ما يأتي، (?!...) وأخرى تمنعه، (?<=...) و (?<!...) تفعلان الشيء نفسه لما سبق. هكذا يُفرض رقم خاص داخل كلمة المرور دون إدراجه في الالتقاط: ^(?=.*\d)(?=.*[A-Z]).{12,}$.
ReDoS: عندما تصبح regex قنبلة موقوتة
مصطلح ReDoS (رفض الخدمة عبر التعبير النمطي) يأتي من التراجع : أمام مدخل شبه مطابق، نمط مثل (a+)+$ يستكشف كل طرق تقطيع « a » قبل أن يفشل، وينمو عدد الانفجارات أسيًا. حركتان: اختبر النمط على حجم واقعي — يفعل ذلك تبويب الأداء نيابة عنك — ولا تُشغِّل regex غير قابل للمراجعة على مدخل من الخارج بلا حد للحجم. على الخادم، regex معلّقة تجمد worker كاملًا حتى نهاية timeout.
JavaScript وPCRE وPython: الأسس نفسها وبعض الفروق
يستخدم الفاحص المحرك الأصلي للمتصفح، أي ECMAScript. الصيغ الأساسية — الفئات وعوامل التكرار والمجموعات وlookahead والأعلام g i m s u y — مشتركة في PCRE (PHP, Perl)، وفي Python عبر re، وفي Java وGo. تتمثل الفروق أساسًا في lookbehind (غاب عن JavaScript طويلًا ومدعوم اليوم)، وفي خصائص Unicode وفي الأعلام المضمّنة مثل (?i)، وهي خاصة بـ PCRE. ترجمة نمط من لغة إلى أخرى تبقى إذًا تمرين تفاصيل — لا ابتكار.
موصى به لـ
مطوّرو الواجهات والخوادم (تحقق من النماذج، وتحليل السجلات، وترحيل البيانات)، وفرق التشغيل وDevOps (مرشّحات الإعداد، وقواعد WAF)، والمختبرون والمحلّلون (استخراج الأعمدة، والتحقق من الصيغ)، وكتّاب المحتوى وحلّالو البيانات (تنظيف الملفات)، والطلبة (فهم المحارف الوصفية)، وكل من يحتاج إلى فاحص تعبيرات نمطية سريع، شامل وسري — مع أدوات مكمّلة هي منسّق JSON، ومشفر ومفكّك ترميز URL، ومشفر ومفكّك ترميز Base64 و مشفر ومفكّك ترميز JWT.