ورقة غش للتعبيرات النمطية قابلة للبحث بصيغة JavaScript: فئات الأحرف، مجموعات الأقواس، الكميات، المراسي، النظر حول، المجموعات والأعلام، كل منها مع مثال.
واحد وأربعون رمز تعبير نمطي مع أمثلة. صفّف عبر الرموز والأوصاف والأمثلة، ثم انسخ الصيغة التي تحتاجها. تغطي صيغة JavaScript (ECMAScript) المستخدمة في المتصفحات وNode.js.
لا يوجد إدخال صيغة يطابق هذا الفلتر.
قراءة وكتابة التعبيرات النمطية بثقة
جدول صيغة، وليس برنامجًا تعليميًا
التعبيرات النمطية كثيفة عن قصد. نمط مثل ^(?:\d{1,3}\.){3}\d{1,3}$ يحزم محقق IPv4 كاملاً في ثلاثين حرفًا، وهو أمر رائع عندما تكون كاتبها وبائس عندما تقرأ عمل شخص آخر. معظم الصعوبة ليست مفاهيمية — بل أن المفردات كبيرة وموجزة وسهلة الحفظ الجزئي.
هذه الصفحة جدول بحث لتلك المفردات، منظم بالطريقة التي تُبنى بها الأنماط فعليًا: ما يطابق حرفًا واحدًا، وكيف تحدد مجموعات الأحرف الخاصة بك، وكيف تقول "كرر هذا"، وأين ترسي المطابقة، وكيف تجمع وتستخدم البدائل، وما الأعلام التي تغير سلوك المحرك. يبحث الفلتر في الرموز والأوصاف والأمثلة في وقت واحد، لذا كتابة "lazy" أو "boundary" أو "lookbehind" تقفز مباشرة إلى الصف الذي تحفظه جزئيًا.
أي صيغة تتبعها هذه الرموز
التعبيرات النمطية ليست لغة واحدة. Grep وPCRE وPython وJava وRE2 من Go وJavaScript تشترك جميعها في نواة مشتركة لكنها تختلف عند الحواف. كل ما هو مذكور هنا يستهدف صيغة JavaScript المعرفة بواسطة ECMAScript، لأن هذا ما يعمل في المتصفح وNode.js ومعظم أدوات الواجهة الأمامية.
ثلاثة اختلافات تستحق الإشارة. أولاً، النظر للخلف — (?<=...) و(?<!...) — مدعوم في محركات JavaScript الحديثة لكنه غائب عن RE2 من Go وعن إصدارات Safari الأقدم، لذا فإن الأنماط التي تعتمد عليه غير قابلة للنقل في كل مكان. ثانيًا، لا تمتلك JavaScript علامة x التفصيلية، لذا لا يمكنك نشر نمط عبر عدة أسطر مع تعليقات بالطريقة التي تسمح بها Python؛ عادةً ما تُجمَّع الأنماط الطويلة من أجزاء نصية بدلاً من ذلك. ثالثًا، \d و\w يقتصران على ASCII افتراضيًا في JavaScript، لذا فإن \w لا يطابق الحروف المعلَّمة أو أحرف CJK ما لم تتحول إلى هروب خصائص Unicode مثل \p{L} مع علامة u.
كتابة أنماط تبقى قابلة للصيانة
عادتان تمنعان معظم آلام regex. الأولى هي الترسية المتعمدة. النمط غير المُرْسى يبحث عن تطابق في أي مكان في السلسلة، وهو ما تريده عند المسح وتقريبًا لا تريده أبدًا عند التحقق. إضافة ^ و$ تحول "يحتوي على شيء يشبه التاريخ" إلى "هو تاريخ"، وهذا التمييز يقف وراء حصة مفاجئة من أخطاء التحقق.
الثانية هي تفضيل الكسل وفئات الأحرف المنفية على أحرف البدل الجشعة. الخطأ الكلاسيكي هو <.+> على نص شبيه بـ HTML: لأن + جشعة، تبتلع كل شيء حتى آخر > في السطر. كتابة <.+?> أو، أفضل، <[^>]+> تطابق وسمًا واحدًا. نسخة الفئة المنفية أسرع أيضًا بشكل ملحوظ، لأن المحرك لا يضطر أبدًا إلى التراجع.
أخيرًا، كن على دراية بالتراجع الكارثي. تداخل الكميات، كما في (a+)+b، يمكن أن يجعل المحرك يستكشف عددًا كبيرًا من الطرق لتقسيم الإدخال قبل أن يستنتج عدم وجود تطابق، مما يحول استدعاء تحقق إلى ناقل رفض خدمة عندما يلامس النمط إدخال المستخدم. إذا احتوى نمط على مجموعة كمية تحتوي نفسها على كمية، أعد كتابتها — عادةً ما تقوم فئة أحرف واحدة مع كمية واحدة بنفس المهمة في وقت خطي. وعندما يكبر النمط إلى ما بعد سطر أو سطرين، فغالبًا ما تكون الإجابة الصادقة أن المحلل الحقيقي هو الأداة الصحيحة وليس regex.
الأسئلة الشائعة
أي صيغة regex تصفها هذه الرموز؟
صيغة JavaScript (ECMAScript)، وهي ما يعمل في المتصفحات وNode.js ومعظم أدوات الواجهة الأمامية. الصيغة الأساسية مشتركة مع PCRE وPython وJava، لذا تنتقل الغالبية العظمى من هذه الرموز مباشرة، لكن تحقق من النظر للخلف وهروب خصائص Unicode إذا كنت تستهدف محركًا آخر.
لماذا يطابق نمطي أكثر مما توقعت؟
دائمًا تقريبًا لأن كمية ما جشعة. يأخذ كل من * و+ أكبر قدر ممكن ويعيد الأحرف فقط عندما يفشل باقي النمط. أضف ? لجعلها كسولة، كما في .+?، أو استبدل حرف البدل بفئة منفية مثل [^>]+، وهو أدق وأسرع معًا.
ما الفرق بين مجموعة ملتقطة وغير ملتقطة؟
تخزن (abc) ما طابقته حتى يمكنك الرجوع إليه لاحقًا بـ \1 أو قراءته من مصفوفة النتائج. تجمع (?:abc) الرموز للكميات أو البدائل دون تخزين أي شيء. استخدم الصيغة غير الملتقطة عندما تحتاج التجميع فقط؛ فهي تحافظ على ثبات فهارس النتائج وتقلل الحمل قليلاً.
لماذا لا يطابق \w الحروف المعلَّمة أو الصينية؟
في JavaScript يُعرف \w بأنه [A-Za-z0-9_] وهو ASCII فقط عن قصد. لمطابقة أحرف من أي نص، استخدم هروب خصائص Unicode مع علامة u: /\p{L}+/u يطابق أحرفًا من اللاتينية والسيريلية واليونانية والهان والكانا وكل النصوص الأخرى.
هل يمكن أن يكون التعبير النمطي خطرًا أمنيًا؟
نعم. الكميات المتداخلة مثل (a+)+b يمكن أن تسبب تراجعًا كارثيًا، حيث يستكشف المحرك احتمالات كثيرة بشكل هائل قبل الفشل. إذا طُبق هذا النمط على إدخال مستخدم، فقد تتجمد العملية بسلسلة قصيرة مصنوعة بعناية. أعد كتابة الكميات المتداخلة في فئة أحرف واحدة حيثما أمكن.
هل يجب أن أستخدم regex لتحليل HTML أو JSON؟
لا. كلاهما تنسيقات متكررة ولا يمكن للتعبيرات النمطية التعبير عن التعشيش العشوائي. استخدم محللًا حقيقيًا: DOMParser لـ HTML، وJSON.parse لـ JSON. التعبيرات النمطية هي الأداة الصحيحة لمسح النص المسطح والتحقق من تنسيقات الحقول البسيطة وإجراء البحث والاستبدال الموجه.