ביטויים רגולריים (Regular Expressions) – הקדמה

ביטויים רגולריים (Regular Expressions) – הקדמה

  • פרסומת

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

מהו ביטוי רגולרי

ביטוי רגולרי (באנגלית Regular Expression או בקיצור RegEx) הוא מחרוזת (סידרה) של תווים המשמשים להגדרת תבניות חיפוש. ניתן לחשוב על ביטויים רגולריים כתחליף מתקדם לשיטת ה- wildcard המוכרת לנו מ-DOS או ממערכות הפעלה מבוססות unix. לדוגמה, בשיטת ה- wildcard, ניתן לחפש את כל הקבצים עם הסיומת exe על ידי הזנת המחרוזת *.exe לשורת החיפוש. התו * משמש כ״ממלא מקום״ וכך ניתן למצוא קבצים ללא הזנת השם המפורט של הקובץ, אלא על ידי הגדרת תבנית כללית – כל קובץ שהשם שלו תואם לתבנית יסומן ויוצג בתוצאות החיפוש. באופן דומה, ניתן לעשות זאת על ידי הביטוי הרגולרי הבא: .*\.exe$

ביטויים רגולריים הם כלי עוצמתי ועתיר אפשרויות המשמש לניתוח טקסט במגוון תחומים. בין השימושים הנפוצים של כלי זה ניתן למנות הדגשת תחביר (syntax highlighting), אימות נתונים (כפי שנעשה בטפסים דיגיטליים), חיפוש מתקדם במנועי חיפוש (אם הם תומכים בכך), קידום אתרים ועוד ועוד. ישנן אפילו שפות תכנות המשתמשות בביטויים רגולריים כחלק מתהליך ההידור (compile) שלהם. עם זאת – ניתוח הטקסט שניתן לעשות בעזרת ביטויים רגולריים הוא מוגבל ויש דברים שלא ניתן לבצע בעזרתם, כמו לדוגמה ניתוח עומק של HTML.

היסטוריה

תוצאה של ביטוי רגולרי

הביטוי הרגולרי /(?<=\.) {1}(?=[A-Z])/g מוצא את כל המרווחים הנמצאים לאחר נקודה ולפני אות גדולה.

המושג "ביטוי רגולרי״ הומצא בשנת 1956 על ידי המתמטקאי סטיבן קלין כחלק משפה שפיתח, שעשתה שימוש בתווים מתמטיים, אולם המושג לא פרץ לתודעה הציבורית עד שנת 1968. בשנה זו החל להעשות שימוש בביטיים רגולריים לניתוח טקסט ולניתוח לקסיקלי (lexical analysis) כחלק מתהליך ההידור של שפות תכנות מסויימות. כיום רוב שפות התכנות מציעות תמיכה בביטיים רגולריים כחלק מהספרייה הסטנדרטית שלהם, כולל Java, Python, PHP, JavaScrip ועוד. ישנן שפות שביטויים רגולריים הם חלק מהתחביר שלהן, כגון שפת Perl.

תחביר בסיסי

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

לדוגמה, הביטוי mu[zs]ic ימצא גם את המילה "music" וגם את המילה "muzik". לסוגריים מרובעים [] יש משמעות מיוחדת בביטוי רגולרי זה (הם מגדירים קבוצה), אך לשאר האותיות אין משמעות מיוחדת.

הביטוי colou?r ימצא את שתי הגרסאות של המילה ״צבע״ באנגלית – "color" ו- "colour". לסימן השאלה יש משמעות מיוחדת – הוא מתייחס לתו שקודם לו, ומקבל 1 או 0 תווים מאותו התו.

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

כלים שימושיים

לפני שניכנס לעומק העניין, רציתי לציין מספר כלים בהם אני אוהב להשתמש כשזה מגיע לניתוח טקסט או אפילו בשביל לבדוק את הביטויים הרגולריים שלי. הראשון הוא האתר regexr.com – אתר המציע הרצת ביטויים רגולריים בזמן אמת, כשהתוצאה שלהם נראית על הטקסט המוזן. מלבד ממשק פשוט ונוח, האתר מציע גם הסבר על הביטוי הרגולרי שהוזן ומסמכי עזר המכילים את כל החוקים של השפה.

אתר איכותי נוסף הוא regex101.com אשר מציע גם הוא הרצה של ביטויים רגולריים ומסמכי עזר. בשונה מהאתר הקודם אשר משתמש במנוע ה-regex של שפת JavaScript בשביל הסימולציה, אתר זה מאפשר לבחור באיזה מנוע להשתמש. נכון לכתיבת מאמר זה, המנועים הנתמכים באתר זה הם של השפות JavaScript, Python ו- PHP/pcre.

אם אתם רוצים תצוגה ויזואלית של הביטוי הרגולרי שלכם, האפליקציה Debuggex.com מאפשר לכם לעשות זאת. לעניות דעתי, הכלי הזה יכול להיות שימושי רק אם אתם כבר שולטים היטב במבנה השפה ומחפשים דרך נוחה למצוא תקלות (debugging) בביטוי שלכם.

תצוגה ויזואלית של הביטוי \(?\d{3}\)? \d{3}(-| )\d{4}

תצוגה ויזואלית של הביטוי \(?\d{3}\)? \d{3}(-| )\d{4}