שיעורי מודול (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, מרכאות, בסוגריים) גרסת עצלן היא כמעט תמיד הגרסה הנכונה.
- כדי להתאים עד סוף השורה אתה בדרך כלל רוצה חמד (
.*).
אסטרטגיות Greedy vs Lazy במנוע
מכמת תאב בצע צורך טקסט רב ככל האפשר וחוזר לאחור רק אם הוא מאולץ. על ידי הוספת ? (lazy), המנוע צורך את המינימום המוחלט ומקדם תו אחד בכל פעם בחיפוש אחר ההתאמה הבאה של התבנית.
נסה את זה
חלץ כל תג HTML מהדוגמה (למשל `**`, `**`, `*`, `*`) באמצעות הגרסה העצלה `.*?`.
הצג רמז
התאמות <.*> חמדניות מתחילת התג הראשון ועד סוף התג האחרון. עצלן <.*?> עוצר ברגע הראשון > שהוא נתקל בו.
הפתרון זמין לאחר 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 ניסיונות