اختبر التعبيرات النمطية لـ JavaScript على نصك الخاص. بدّل أعلام g وi وm وs وu، وافحص كل تطابق مع فهرسه ومجموعات الالتقاط، وشاهد معاينة نتيجة الاستبدال مباشرة.
شاهد كل تطابق وكل مجموعة وكل فهرس أثناء كتابتك. أدخل نمطًا وبعض النصوص للمطابقة ضده. يُدرج كل نتيجة مع موضعها ومجموعات الالتقاط، وتبلغ الأنماط غير الصالحة برسالة خطأ المحرك نفسه، ويظهر حقل الاستبدال بالضبط ما سينتجه استدعاء استبدال.
//g
التطابقات–
قراءة تعبير نمطي بالطريقة التي يقرأها المحرك
الأعلام تغير المعنى، وليس البحث فقط
الأعلام الخمسة ليست تفضيلات، بل تعيد تعريف النمط. بدون g، يعيد البحث التطابق الأول ويتوقف؛ معه، يحتفظ المحرك بمؤشر lastIndex ويمشي عبر السلسلة بأكملها، ولهذا السبب أيضًا قد يبدو regex عام يُعاد استخدامه عبر استدعاءات وكأنه يتخطى التطابقات. تطوي علامة i حالة الأحرف باستخدام تخطيط حالات Unicode وليس تحول ASCII بسيط.
الأكثر سوء فهم هما m وs. تغير m فقط معنى ^ و$، مرسيةً إياهما عند حدود الأسطر بدلاً من السلسلة بأكملها؛ ولا تفعل شيئًا لـ .. بالمقابل تغير s فقط .، لتجعله يطابق سطرًا جديدًا. الاسم "dotall" هو المفيد لتذكره. تجعل علامة u النمط يعمل على نقاط الكود بدلاً من وحدات UTF-16، لذا يطابق . رمزًا تعبيريًا كوحدة واحدة وتصبح هروبات \u{1F600} قانونية. كما تجعل الهروبات المتسامحة سابقًا خطأً، ولهذا قد ينكسر نمط موجود بمجرد إضافتها.
المجموعات والفهارس والاستبدال
كل قسم بين قوسين يلتقط افتراضيًا، مرقمًا بترتيب قوس الافتتاح، وهذه الأرقام هي ما يشير إليه $1 و$2 في استبدال. يتبع التعشيش نفس القاعدة، لذا في ((a)b) المجموعة الأولى ab والثانية a. عندما تحتاج تجميعًا للبدائل أو التكرار فقط، يتجنب (?:...) تخصيص التقاط ويحافظ على ترقيم قابل للقراءة.
الفهرس المبلغ عنه لكل تطابق هو إزاحة أول حرف مطابق، وهو أمر أكثر أهمية مما يبدو. يتيح لك التمييز بين تطابقين متطابقين في مواضع مختلفة، وتأكيد أن المرسى فعل ما توقعته، وتشخيص التطابق الصفري الكلاسيكي. نمط مثل \d* يطابق السلسلة الفارغة في كل مكان، لذا يجد المسح العام تطابقًا في كل موضع؛ لا يتقدم المحرك إلا لأن التطبيقات تجبر المؤشر على الأمام عندما يكون التطابق فارغًا.
التراجع وحد المطابقة
تستخدم معظم المحركات، بما فيها محرك JavaScript، التراجع. عندما يفشل جزء من النمط، يعود المحرك إلى آخر نقطة قرار ويجرب مسارًا آخر. عادةً يكون هذا غير مرئي. يصبح كارثيًا عندما تجعل الكميات المتداخلة عدد المسارات ينمو بشكل هائل، والشكل الكلاسيكي (a+)+b ضد سلسلة طويلة من أحرف a بدون b. يمكن لذلك الإدخال أن يعلّق تبويب متصفح، وإذا جاء النمط من إدخال مستخدم يصبح ناقل رفض خدمة.
عادتان تتجنبان معظم ذلك: فضّل فئات الأحرف المحددة على .* حتى لا تتداخل البدائل، ورْسِ الأنماط حيث يمكنك، لأن الفشل المرسى يُرفض فورًا بدلاً من إعادة محاولته عند كل إزاحة. تحد هذه الأداة أيضًا النتائج عند 500 تطابق وتخبرك عندما اقتطعت، لذا يتحول النمط الجامح إلى نتيجة بطيئة بدلاً من صفحة متجمدة.
الأسئلة الشائعة
أي صيغة regex يستخدم هذا؟
JavaScript، أي محرك ECMAScript المدمج في متصفحك. أنماط Perl وPCRE وPython قريبة لكنها تختلف في النظر للخلف والمجموعات المسماة وبعض الهروبات.
ما الذي تغيره علامة g فعلاً؟
بدونها تحصل فقط على التطابق الأول. معها يمسح المحرك السلسلة بأكملها ويعيد كل تطابق، وهو ما يملأ القائمة هنا.
لماذا أحصل على تطابقات فارغة؟
يمكن لنمطك أن يطابق صفر أحرف، كما يفعل `\d*`. يبلغ المسح العام عندها عن تطابق في كل موضع، ويتقدم المحرك يدويًا لتجنب التكرار اللانهائي.
كيف أشير إلى مجموعات الالتقاط في الاستبدال؟
استخدم $1 للمجموعة الأولى و$2 للثانية و$& للمطابقة الكاملة. اكتب $$ إذا كنت تحتاج علامة دولار حرفية.
ماذا يعني "عرض أول 500"؟
يُحد قائمة النتائج عند 500 تطابق حتى لا يجمّد النمط الواسع جدًا الصفحة. تظل معاينة الاستبدال تنطبق على النص بأكمله.
لماذا يجعل نمطي الصفحة بطيئة؟
الكميات المتداخلة مثل (a+)+ تسبب تراجعًا هائلًا. استخدم فئات الأحرف المحددة بدلاً من .* ورْسِ النمط للحفاظ على المطابقة خطية.