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

קבוצות שאינן לוכדות: `(?:...)`

לעתים קרובות יש צורך בסוגריים רק כדי לקבץ (לכמת, לחלופין) ולא כדי לחלץ את הערך. במקרה זה השתמש ב-לא לכידה גרסה: (?:...). זה עובד באופן זהה ל-(...) אבל לא יוצר קבוצה ממוספרת.

Code
Pattern: (?:https?)://(\w+\.\w+)
Sample:  https://example.com e http://test.org
Match e gruppi:
  match  = "https://example.com"   gruppo1 = "example.com"
  match  = "http://test.org"        gruppo1 = "test.org"

(?:https?) מקבץ את הסכימה כדי להחיל את המכמת ?, אבל אנחנו לא מעוניין לחלץ את https כקבוצה: קבוצה 1 היא ישירות ה- דומיין.

למה להשתמש בו

  1. קריאה: הקורא מבין מיד שהקבוצה שם רק בשביל מבנה, לא לחלץ ערך.
  2. ביצועים: המנוע לא חייב לאחסן את הגפרור של הקבוצה.
  3. מספור נקי: קבוצות ממוספרות נשארות מיושרות איתן "מידע שאני באמת צריך", ללא הפרעות.

אופטימיזציה עם קבוצות שאינן לוכדות

שימוש ב-(?:...) אומר למנוע להחיל כללי קיבוץ וכימות מבלי לבזבז זיכרון באחסון תוצאות התאמה ביניים. זה מומלץ מאוד בלולאות כבדות או בעיבוד טקסט ארוך מאוד.

נסה את זה

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

חלץ את הדומיין (`example.com`, `test.org`...) מכל כתובת אתר בטקסט. השתמש ב-`(?:https?)` עבור הפרוטוקול (אין צורך ללכוד אותו) ובקבוצה בודדת עבור הדומיין.

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

שנה את הקבוצה הראשונה מ-(https?) ל-(?:https?): אין צורך ללכוד אותה, אתה רוצה רק את הדומיין.

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

סקירת התרגיל

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

מצא כל חזרה של 'ab' כהתאמה בודדת, אבל בלי ללכוד את הקבוצה (מכיוון שאתה צריך רק את כל ההתאמה).

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

אותו תחביר כמו השיעור הקודם, אבל עם (?:ab)+ במקום (ab)+.

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

אתגר נוסף

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

Find price digits followed optionally by decimal parts inside a non-capturing group, e.g. `100` or `100.50`.

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

השתמש ב-(?:\\.\\d{2})? כדי להפוך את החלק העשרוני לאופציונלי מבלי ללכוד אותו.

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