الانتقال إلى المحتوى الرئيسي
الوحدة 2 · الدرس 4 من 48/32 في الدورة~12 min
دروس الوحدة (4/4)

التراجع: نظرة عامة

عندما "يتجاوز" محدد الكم الجشع، يقوم المحرك بالتراجع: فإنه يتراجع، ويحاول تكوينًا آخر، ويعيد المحاولة. على أنماط بسيطة ذلك غير مرئي؛ في الأنماط المكتوبة بشكل سيء، يمكن أن تصبح أسية و تجميد المتصفح لمدة ثواني. إنه جذر ReDoS (العادي تعبير رفض الخدمة).

Code
Pattern: .*\d
Sample:  abc123def
Steps:
  1.  .*  consumes everything: "abc123def"
  2.  \d  fails (end of string).
  3.  Backtrack: .* drops 'f' -> "abc123de", \d fails on 'f'.
  4.  Backtrack: .* drops 'ef' -> "abc123d", \d fails on 'e'.
  5.  ... and so on until \d finds a digit: match = "abc123" + "?"... actually
       the pattern matches "abc123" because .* leaves "def" and \d looks at '3'? No: the
       backtrack continues and .* ends up being "abc12", \d=3.  Final match: "abc123".

يصل المحرك دائمًا إلى هناك، ولكن إذا احتوى المُحدِّد الكمي الجشع محدد كمية جشع آخر (على سبيل المثال (a+)+)، عدد التكوينات لمحاولة يمكن أن تنفجر.

أنماط كارثية

Code
Pattern: (a+)+b
Sample:  aaaaaaaaaaaaaaaaaaaaa

لا يوجد أي زائدة b → يفشل النمط، ولكن للوصول إلى هناك، يحاول المحرك كل مرة التقسيم المحتمل لـ as. النمو الأسي: يمكنك تحقيق ذلك خلال 30 as انتظر لساعات.

مخاطر التراجع وReDoS

عندما يحتوي النمط على محددات كمية متداخلة أو متداخلة (على سبيل المثال (a+)+)، يقوم المحرك بتقييم عدد كبير من المسارات قبل الفشل. يؤدي استبدال أحرف البدل العامة باستبعاد فئات الأحرف إلى تقليل مسارات التراجع بشكل كبير.

جربه

تمرين#regex.m2.l4.e1
المحاولات: 0جارٍ التحميل…

استخرج المحتوى بين قوسين معقوفين لكل تواجد في النص. استخدم النسخة البطيئة من محدد الكمية لتجنب القفز إلى عمليات الإغلاق اللاحقة.

جارٍ تحميل المحرر…
إظهار التلميح

\\[.*?\\] يتوقف عند الإغلاق الأول ]: لا يوجد تراجع كبير.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#regex.m2.l4.e2
المحاولات: 0جارٍ التحميل…

ابحث عن كل عنوان URL `http://...` أو `https://...` في النص، باستخدام محدد الكمية `؟` للأحرف الاختيارية `s` و`\\S+` للأحرف غير الفضائية للمسار.

جارٍ تحميل المحرر…
إظهار التلميح

https؟ يعني "http" متبوعًا بحرف "s" اختياري. ثم //، ثم \\S+ (بدون مسافات).

الحل متاح بعد 3 من المحاولات

التحدي الإضافي

تمرين#regex.m2.l4.e3
المحاولات: 0جارٍ التحميل…

Match strings enclosed in double quotes, avoiding excessive backtracking by using the negated class `[^"]*` instead of `.*`.

جارٍ تحميل المحرر…
إظهار التلميح

Replace the dot with the negated class [^"] to restrict the engine's backtracking paths.

الحل متاح بعد 3 من المحاولات