שליטה בביטויים רגולריים מורכבים
ביטויים רגולריים (רגקס) הם כלים מגוונים להתאמת דפוסים ולמניפולציה של טקסט. מדריך זה בוחן טכניקות מתקדמות של ביטויים רגילים המסייעים לך לנהל תרחישים מורכבים של עיבוד טקסט בצורה יעילה יותר.
הסתכל מאחורי קביעות
קביעות Lookbehind מאפשרות לך להתאים דפוס רק אם לפניו דפוס אחר. זה שימושי להבטחת הקשר מבלי לכלול אותו בהתאמה.
- מבט חיובי מאחורי
(?<=...)
: מתאים לתבנית רק אם לפניה הביטוי שצוין. - Lookbehind שלילי
(?<!...)
: מתאים לתבנית רק אם אין לפניו הביטוי שצוין.
דוגמא:
(?<=Mr\.|Mrs\.)\s[A-Z]\w+
הביטוי הרגולרי הזה תואם לשמות שלפניהם "Mr." או "Mrs.".
דפוסים מותנים
דפוסים מותנים מאפשרים לך להתאים דפוסים שונים על סמך אם תנאי מסוים מתקיים. התחביר הוא (?(תנאי)true-pattern|false-pattern)
.
דוגמא:
(\d{3}-)?\d{3}-\d{4}
הביטוי הרגולרי הזה מתאים למספרי טלפון עם או בלי קידומת חיוג.
תתי שגרות ורקורסיה
תתי שגרות ורקורסיה מאפשרים לך לעשות שימוש חוזר בדפוסים בתוך אותו ביטוי רגולרי או להתאים מבנים מקוננים. זה שימושי במיוחד עבור נתונים מורכבים ומקוננים.
דוגמא:
(?<group>\((?>[^()]+|(?&group))*\))
הביטוי הרגולרי הזה מתאים לסוגריים מאוזנים עם רמות מקוננות.
מכונות רכושיות
מכמים רכושיים מונעים ממנוע ה-Regex לחזור אחורה, מה שיכול לשפר את הביצועים כאשר אתה רוצה להבטיח שלא יתרחש מעקב לאחור.
דוגמא:
\w++
הביטוי הרגולרי הזה מתאים לרצף של תווי מילים באופן רכושני, כלומר הוא לא יוותר על תווים לאחר התאמה.
שימוש בדגלים להתאמה משופרת
דגלים רגילים משנים את התנהגות התאמת הדפוס. כמה דגלים נפוצים כוללים:
- 'i': התאמה לא תלוית רישיות.
- 'm': מצב ריבוי קווים, המשפיע על ההתנהגות של
^
ו-$
. - 's': מצב Dotall, המאפשר ל-
.
להתאים לתווים בשורה חדשה. - 'x': התעלם מרווח לבן ואפשר הערות בתוך התבנית לצורך קריאה.
דוגמא:
/pattern/imsx
דפוס זה מחיל את המצבים חסרי רגישות לאותיות גדולות, ריבוי קווים, נקודות ומצבים מורחבים.
דוגמאות בשפות תכנות
הנה כמה דוגמאות לשימוש ב-Regex מתקדם ב-Python וב-JavaScript:
דוגמה לפייתון
import re
# Match a name preceded by Mr. or Mrs.
pattern = r'(?<=Mr\.|Mrs\.)\s[A-Z]\w+'
text = 'Mr. Smith and Mrs. Johnson'
matches = re.findall(pattern, text)
for match in matches:
print('Match found:', match)
דוגמה ל-JavaScript
// Match a name preceded by Mr. or Mrs.
const pattern = /(?<=Mr\.|Mrs\.)\s[A-Z]\w+/g;
const text = 'Mr. Smith and Mrs. Johnson';
const matches = text.match(pattern);
if (matches) {
matches.forEach(match => console.log('Match found:', match));
}
סיכום
טכניקות מתקדמות של ביטויים רגולריים כגון קביעות מבט מאחורי, תבניות מותנות, תתי שגרות, רקורסיה ומכימות רכושניות מרחיבות את היכולות של ביטוי רגולרי לעיבוד טקסט מורכב. שליטה במושגים הללו מאפשרת לך להתמודד עם משימות התאמה ומניפולציה מתוחכמות ביעילות ובדיוק גבוהים יותר.