دروس الوحدة (3/4)
الجشع مقابل كسول
بشكل افتراضي، تكون مُحدِّدات الكمية جشعة: فهي تستهلك قدر الإمكان
مع الحفاظ على النمط صالحًا. إضافة ? بعد محدد الكمية (*?، +?،
??، {n,m}?) يمنحك الإصدار الكسالى: فهو يستهلك **القليل من
ممكن **.
Sample: **uno** e *due*
Greedy pattern <.*> matches: **uno** e *due* (everything)
Lazy pattern <.*?> matches: ** **
* * (4 matches with the g flag)نفس النمط بالضبط، مع إضافة حرف واحد للاختلاف (?) إلى ملف
الكمي)، نتائج مختلفة تماما.
عندما يهم
- لاستخراج المحتوى بين المحددات (علامات HTML، علامات الاقتباس، بين قوسين) الإصدار lazy هو دائمًا تقريبًا الإصدار الصحيح.
- للمطابقة حتى نهاية السطر، عادةً ما تريد الجشع (
.*).
استراتيجيات الجشع مقابل الكسل في المحرك
يستهلك المُحدِّد الكمي الجشع أكبر قدر ممكن من النص ولا يتراجع إلا إذا اضطر إلى ذلك. من خلال إضافة ? (lazy)، يستهلك المحرك الحد الأدنى المطلق ويتقدم حرفًا واحدًا في كل مرة بحثًا عن المطابقة التالية للنمط.
جربه
استخرج كل علامة HTML من العينة (على سبيل المثال، `**`، `**`، `*`، `*`) باستخدام الإصدار البطيء `.*?`.
إظهار التلميح
يتطابق Greedy <.*> من بداية العلامة الأولى حتى نهاية العلامة الأخيرة. كسول <.*?> يتوقف عند أول > يصادفه.
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
قم باستخراج كل سلسلة بين علامات الاقتباس المزدوجة في النص (على سبيل المثال، "ciao"، "mondo"). استخدم النسخة البطيئة من محدد الكمية لتجنب القفز إلى عمليات الإغلاق اللاحقة.
إظهار التلميح
".*؟" يتوقف عند أول عرض أسعار مزدوج للإغلاق.
الحل متاح بعد 3 من المحاولات
التحدي الإضافي
Extract all text blocks enclosed in square brackets (e.g. `[text]`), including the brackets, using a lazy quantifier so as not to merge separate blocks.
إظهار التلميح
استخدم \\[ للقوس المفتوح، ثم .*؟ وأخيرًا \\] للقوس المغلق.
الحل متاح بعد 3 من المحاولات