דילוג לתוכן המרכזי
מודול 2 · שיעור 3 מתוך 47/32 בקורס~10 min
שיעורי מודול (3/4)

חמדן לעומת עצלן

כברירת מחדל, מכמתים הם חמדנים: הם צורכים כמה שיותר תוך שמירה על תוקף התבנית. הוספת ? לאחר מכמת (*?, +?, ??, {n,m}?) נותן לך את הגרסה עצלה: היא צורכת מעט אפשרי.

Code
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), המנוע צורך את המינימום המוחלט ומקדם תו אחד בכל פעם בחיפוש אחר ההתאמה הבאה של התבנית.

נסה את זה

פעילות גופנית#regex.m2.l3.e1
ניסיונות: 0טוען...

חלץ כל תג HTML מהדוגמה (למשל `**`, `**`, `*`, `*`) באמצעות הגרסה העצלה `.*?`.

טוען עורך...
הצג רמז

התאמות <.*> חמדניות מתחילת התג הראשון ועד סוף התג האחרון. עצלן <.*?> עוצר ברגע הראשון > שהוא נתקל בו.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#regex.m2.l3.e2
ניסיונות: 0טוען...

חלץ כל מחרוזת בין מרכאות כפולות בטקסט (למשל "ciao", "mondo"). השתמש בגרסה העצלה של המכמת כדי להימנע מקפיצה לסגירות מאוחרות יותר.

טוען עורך...
הצג רמז

".*?" עוצר במירכאה הכפולה הראשונה.

הפתרון זמין לאחר 3 ניסיונות

אתגר נוסף

פעילות גופנית#regex.m2.l3.e3
ניסיונות: 0טוען...

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 ניסיונות