ביטויים רגולריים#

ביטוי רגולרי (regexp, regex) הוא תבנית הקובעת אם מחרוזת בעלת צורה נתונה, או חולצת חלקים ממחרוזת כזו. Perl מתייחסת לביטויים רגולריים כתת־שפה ממדרגה ראשונה: הם מופיעים בכל מקום שבו מבצעים התאמה (m//), החלפה (s///), ציטוט תבנית (qr//) או פיצול לפי מפריד (split).

מדריך זה הוא מדריך העיון הסמכותי של pperl לביטויים רגולריים. כל פרק מכסה נושא אחד בשלוש שכבות: סקירה כללית לכיוון ראשוני, מדריך עיון מדויק המגדיר את פעולת המבנה, ופרטי הפרטים — מקרי קצה, פתולוגיות ביצועים, וההבדלים בין מנועים שמפתיעים את הקורא הרגיל לעבוד עם Perl. אותו פרק משרת את הקורא שזקוק לתשובה בת פסקה אחת ואת הקורא שרוצה לדעת בדיוק מתי תבנית תתנהג בצורה שגויה.

למי זה מיועד#

קוראים שמכירים את Perl ברמה מספקת לשימוש בסקלרים, מערכים והאשים, אך מתייחסים לביטויים רגולריים כאל משהו להעתיק ממקום אחר ולקוות שיעבוד. לאחר הקריאה, ניתן יהיה לקרוא תבנית לא מוכרת ולדעת מה היא תתאים — ומתי היא תסרב, ומדוע.

כיצד מאורגן המדריך#

הפרקים נועדו להיקרא לפי הסדר במעבר ראשון, אך כל אחד עומד בפני עצמו כעיון מאוחר יותר.

  • יסודותm//, s///, אופרטורי הקישור =~ ו־!~, מה נחשב למטה־תו, כיצד לבצע escape, מודל הניתוח בן ארבעת השלבים.

  • מחלקות תווים — מחלקות בסוגריים מרובעים […], מחלקות שלילה, קיצורים \d \w \s, מחלקות POSIX, הצורה המורחבת בסוגריים (?[…]), דוגמה מעובדת של כתובת IP.

  • עוגנים והיגדים^, $, \b, \A, \z, \G, \K, lookahead, lookbehind, גבולות Unicode מסוג \b{…}, סמיכות כ־AND.

  • מכמתים*, +, ?, {n,m}, חמדן מול לא־חמדן מול קנייני, עקרונות ההתאמה.

  • קבוצות ולכידות(...), (?:...), לכידות בעלות שם, הפניות לאחור, קבוצות אטומיות, תת־תבניות רקורסיביות, תבניות מותנות, איפוס ענף.

  • חלופה|, קדימות, פירוק תחילית משותפת, חלופות ריקות, איפוס ענף.

  • מתאמים/i, /m, /s, /x, /xx, /g, /c, /r, /e, /n, /p, /o, /a, /aa, /u, /l, /d, צורות שורתיות (?i…), צורות מתוחמות (?i:…), מודל הניתוח בן ארבעת השלבים, use re 'strict'.

  • החלפהs/// לעומק: מחרוזת ההחלפה, /e, /ee, /r, \K בהחלפה, סיום התאמה באורך אפס.

  • Unicode\p{…}, \P{…}, \X, מערכות כתב, מתאמי ערכת תווים, קיפול אותיות, רצפי כתב, קידוד מול תו.

  • ביצועים — חזרה לאחור (backtracking), תבניות קטסטרופליות, פריסת הלולאה, קבוצות אטומיות, מכמתים קנייניים, תבניות רקורסיביות, קוד מוטמע, פעלי בקרה מיוחדים על חזרה לאחור, אופטימיזציות פנימיות שהמנוע מיישם עבורך.

  • השוואה בין מנועים — השוואה מול PCRE2, Emacs, POSIX BRE, POSIX ERE, ו־RE2 / Go.

סיבוב ראשון הלוך־ושוב#

תוכנית הביטוי הרגולרי השימושית הקצרה ביותר — מציאת מילים בנות שלוש אותיות החוזרות גב אל גב, מופרדות ברווח יחיד:

my $text = "I said the the other day";
if ($text =~ /\b(\w{3})\s\1\b/) {
    print "Repeated: $1\n";        # Repeated: the
}
  • \b הוא גבול מילה — התבנית מופעלת רק בקצוות מילים.

  • (\w{3}) לוכד בדיוק שלושה תווי מילה לתוך $1.

  • \s הוא תו רווח לבן יחיד בין שני העותקים.

  • \1 הוא ההפניה לאחור: התאמה של אותם שלושה תווים שוב.

כל תבנית מורכבת יותר במדריך מבוססת על אותו רעיון — לעגן היכן שצריך, לתאר את הרצוי, ללכוד את מה שיש להחזיר.

מוסכמות בדוגמאות#

  • פלט הדוגמה מופיע כהערה שורתית # לצד הביטוי שמייצר אותו.

  • הדוגמאות מניחות מתאמים ברירת־מחדל אלא אם מוצגים /i, /x וכו«.

  • כאשר תבנית מוצגת בנפרד (ללא =~), יש להתייחס אליה כמקטע שהטקסט שמסביב ישלב עם מחרוזת.

  • כאשר נדרש תו Unicode, הדוגמאות משתמשות ב־\x{263a} או ב־\N{GREEK SMALL LETTER SIGMA} כך שהטקסט המוצג תואם את המקור.