دروس الوحدة (4/4)
التراجع: نظرة عامة
عندما "يتجاوز" محدد الكم الجشع، يقوم المحرك بالتراجع: فإنه يتراجع، ويحاول تكوينًا آخر، ويعيد المحاولة. على أنماط بسيطة ذلك غير مرئي؛ في الأنماط المكتوبة بشكل سيء، يمكن أن تصبح أسية و تجميد المتصفح لمدة ثواني. إنه جذر ReDoS (العادي تعبير رفض الخدمة).
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+)+)، عدد التكوينات
لمحاولة يمكن أن تنفجر.
أنماط كارثية
Pattern: (a+)+b
Sample: aaaaaaaaaaaaaaaaaaaaaلا يوجد أي زائدة b → يفشل النمط، ولكن للوصول إلى هناك، يحاول المحرك كل مرة
التقسيم المحتمل لـ as. النمو الأسي: يمكنك تحقيق ذلك خلال 30 as
انتظر لساعات.
مخاطر التراجع وReDoS
عندما يحتوي النمط على محددات كمية متداخلة أو متداخلة (على سبيل المثال (a+)+)، يقوم المحرك بتقييم عدد كبير من المسارات قبل الفشل. يؤدي استبدال أحرف البدل العامة باستبعاد فئات الأحرف إلى تقليل مسارات التراجع بشكل كبير.
جربه
استخرج المحتوى بين قوسين معقوفين لكل تواجد في النص. استخدم النسخة البطيئة من محدد الكمية لتجنب القفز إلى عمليات الإغلاق اللاحقة.
إظهار التلميح
\\[.*?\\] يتوقف عند الإغلاق الأول ]: لا يوجد تراجع كبير.
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
ابحث عن كل عنوان URL `http://...` أو `https://...` في النص، باستخدام محدد الكمية `؟` للأحرف الاختيارية `s` و`\\S+` للأحرف غير الفضائية للمسار.
إظهار التلميح
https؟ يعني "http" متبوعًا بحرف "s" اختياري. ثم //، ثم \\S+ (بدون مسافات).
الحل متاح بعد 3 من المحاولات
التحدي الإضافي
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 من المحاولات