تخطَّ إلى المحتوى الرئيسي
Tooletto

مُختبِر التعبيرات النمطية

اختبر تعبيرات JavaScript النمطية مقابل نص عينة بتمييز حي، مجموعات التقاط، مجموعات مُسمّاة، ومعاينة استبدال. يعمل بالكامل في متصفحك.

  • الملفات لا تغادر جهازك أبدًا
  • مجاني، بدون تسجيل
  • بدون علامات مائية
  • يعمل دون اتصال بعد التحميل
Loading tool…

كيفية استخدام مُختبِر التعبيرات النمطية

  1. 1

    أدخل نمطك

    اكتب التعبير واختر العلامات (flags) التي تحتاجها.

  2. 2

    أضف نص اختبار

    تُميَّز التطابقات أثناء الكتابة، مع سرد كل مجموعة التقاط.

  3. 3

    اختبر استبدالًا

    يعاين تبويب الاستبدال النتيجة باستخدام مراجع بنمط $1.

لماذا يتفوق التمييز الحي على قراءة نمط في رأسك

تعبير نمطي صعب حقًا تتبعه ذهنيًا مقابل نص حقيقي — نمط مثل `(\d{3})-(\d{2})-(\d{4})` قابل للقراءة بما يكفي كوصف مجرد، لكن تأكيد أنه يطابق بالضبط السلاسل الفرعية المقصودة، وتلك فقط، مقابل كتلة معينة من نص عينة نوع فحص مختلف عن قراءة النمط والتفكير فيه. تمييز كل تطابق مباشرة في نص العينة أثناء كتابة النمط يحوّل ذلك التفكير المجرد إلى تأكيد بصري ملموس وفوري — تظهر التطابقات حيث كان مُتوقَّعًا أو لا تظهر، دون الحاجة لمحاكاة ذهنية.

هذا يصبح قيّمًا بشكل خاص لأي شيء يستخدم lookahead أو lookbehind أو مُحدِّدات كمية غير جشعة، حيث حدود التطابق الفعلية غالبًا ليست ما سيُخمِّنه أحدهم بمجرد قراءة النمط. رؤية أين يبدأ وينتهي تطابق بالضبط، بدلًا من الافتراض، يكتشف خطأ حد بمقدار واحد فورًا بدلًا من بعد نشره داخل دالة تحقق.

regex جافاسكريبت ليست نفس لغة PCRE أو re بايثون

تبدو صياغة التعبيرات النمطية متشابهة على نطاق واسع بين اللغات، لكن الميزات المحددة المدعومة تختلف بطرق تهم بمجرد أن يستخدم نمط شيئًا يتجاوز الأساسيات. يفتقر JavaScript إلى مُحدِّدات كمية حيازية ومجموعات ذرية، كلاهما موجود في PCRE (المستخدَمة بواسطة PHP وأدوات أخرى كثيرة) كطرق لمنع صراحة أنماط تراجع معينة. تأكيدات lookbehind، المدعومة الآن في JavaScript، وصلت متأخرة كثيرًا عن lookahead ولم تكن متاحة في نسخ أقدم من المتصفحات، وهو ما لا يزال يهم أحيانًا لكود يجب تشغيله في بيئات قديمة. و`\d` في نمط JavaScript يطابق فقط أرقام ASCII 0–9 ما لم يحمل النمط أيضًا علامة `u` (Unicode)، مما يفاجئ أي شخص يفترض أنه يتصرف مثل فئة أرقام واعية بـUnicode في محرك regex للغة أخرى. اختبار نمط مُخصَّص تحديدًا لـJavaScript، بدلًا من نسخ مثال مكتوب لبايثون أو أداة شل، هو ما بُنيت هذه الأداة حوله.

التراجع الكارثي، ولماذا للمُختبِر ميزانية زمنية

أنماط regex معينة — الأكثر شيوعًا تلك ذات مُحدِّدات كمية متداخلة، مثل `(a+)+b` — لها خاصية مرضية حيث، مقابل سلسلة طويلة لا تتطابق في النهاية، يستكشف المحرك عددًا متزايدًا أسيًّا من طرق التراجع قبل الاستسلام. نمط يُعيد نتائج فورًا مقابل سلسلة من عشرة أحرف لا تتطابق قد يستغرق أطول من عمر الكون مقابل سلسلة من خمسين حرفًا، وهذا ليس مبالغة بل السلوك الرياضي الحرفي للنمو الأسي. هذه فئة حقيقية وقابلة للاستغلال من الثغرات في أنظمة الإنتاج — ReDoS، أو حجب خدمة عبر تعبير نمطي — حيث يمكن لمهاجم يتحكم في سلسلة الإدخال لنمط ضعيف تعليق عملية خادم إلى أجل غير مسمى بطلب واحد.

تُلغي هذه الأداة التقييم بعد ميزانية زمنية قصيرة تحديدًا حتى يُجمِّد نمط بهذه الخاصية جلسة الاختبار بدلًا من تبويب المتصفح بالكامل، والوصول إلى ذلك الإلغاء معلومة مفيدة في حد ذاتها: يعني أن النمط على الأرجح لديه بالضبط هذه الثغرة ويحتاج إعادة هيكلة، عادةً بجعل مُحدِّد كمي داخلي أكثر تحديدًا حتى لا ينشأ الغموض المُسبِّب للتراجع الأسي من الأساس.

الأسئلة الشائعة

ما لهجة regex هذه؟

JavaScript (ECMAScript)، وهو ما يعمل في متصفحك. تختلف عن PCRE وبايثون في بعض النقاط — بدون lookbehind في متصفحات قديمة جدًا، بدون مُحدِّدات كمية حيازية (possessive) ولا مجموعات ذرية، و`\d` يطابق فقط أرقام ASCII ما لم تستخدم علامة `u`.

ماذا تُغيِّر علامة global فعليًا؟

دون `g`، يُوجَد فقط أول تطابق. معها، تُعاد كل التطابقات — وهو ما تريده للتمييز أو الاستبدال عبر مستند كامل. تُظهر هذه الأداة كل التطابقات على أي حال، لكن العلامة لا تزال تؤثر على كيفية تصرف `replace`.

لماذا انتهت مهلة نمطي؟

بعض الأنماط تتراجع (backtrack) بشكل كارثي — مُحدِّدات كمية متداخلة مثل `(a+)+b` يمكن أن تستغرق وقتًا أسيًّا في سلسلة لا تتطابق. تُلغي الأداة العملية بعد ميزانية زمنية قصيرة بدلًا من تجميد تبويبك. إذا حدث ذلك، الإصلاح تقريبًا دائمًا جعل المُحدِّد الكمي الداخلي أكثر تحديدًا.

كيف أستخدم مجموعات التقاط في استبدال؟

أشِر إليها كـ`$1` و`$2` وهكذا، أو `$<اسم>` للمجموعات المُسمّاة المكتوبة `(?<اسم>…)`. استخدم `$&` لكل التطابق و`$$` لعلامة دولار حرفية.