ביטוי רגולרי
מתוך ויקיפדיה, האנציקלופדיה החופשית
במדעי המחשב, ביטוי רגולרי (באנגלית Regular expression או בקיצור regex) הינו מחרוזת (רצף של תווים) המתארת קבוצת מחרוזות על פי כללי תחביר מסוימים. בעזרת ביטוי רגולרי ניתן לחפש או לשנות טקסט על ידי תיאור דפוס מסוים של רצפי תווים וכללים לגבי מיקומם ביחס לתווים אחרים.
שימוש נפוץ בביטויים רגולריים הוא לחיפוש והחלפה של טקסטים במעבד תמלילים. כמו כן יש להם שימוש רב בשפות תיכנות כמו perl ו-Tcl לצורת עיבוד נתונים טקסטואליים, אך הפופולריות של הביטויים הרגולריים גברה בעקבות הפונקציונליות שלהם בפקודות ה-UNIX הנפוצות: grep ו-sed.
בתורת השפות הפורמליות, ביטוי רגולרי הוא ביטוי שמסוגל לתאר אוסף של מילים (שפה) באמצעות שימוש בשלוש פעולות בסיסיות. חשיבותם של הביטויים הרגולריים נובעת מהקשר שלהם לשפות הרגולריות: כל שפה רגולרית (כלומר, המתקבלת על ידי מכונת מצבים סופית) ניתנת להצגה באמצעות ביטוי רגולרי, וכל ביטוי רגולרי מייצג שפה רגולרית (כלומר, ישנה שקילות בין השפות הרגולריות והביטויים הרגולריים).
תוכן עניינים |
[עריכה] שימושים במדעי המחשב
התמיכה בביטויים רגולריים שונה מעט בין תוכנה לתוכנה, אך נשתדל להדגים את השימוש בביטויים רגולריים בתוכנות ושפות שונות על ידי דוגמאות סטנדרטיות הפועלות בכולן.
באופן כללי, אם נסביר על ידי דוגמה, הביטוי ab[2-5]de מתאים למילים ab2de,ab3de,ab4de ו-ab5de כיון שפירושו הוא: כל המחרוזות בהם מופיעה האות a, לאחריה b, לאחריה מספר בין 2 ל-5 ואחר כך d ו-e. באופן דומה, הביטוי a.b פירושו האות a ו-b וביניהן כל תו, והביטוי ab*c פירושו האותיות a ו-c וביניהן האות b בכמות כלשהי (ac,abc,abbc,abbbbbbbc וכו').
- ב-VI, מעבד התמלילים הנפוץ במערכות UNIX הפקודה הבאה:
- %s/gr[ea]y/white/
תחליף כל הופעה של המילה grey או gray במילה white. (% מפעיל את הפקודה על כל השורות ו-s פירושו החלפה, substitute).
- התוכנה grep היתפתחה מפקודה שהייתה נפוצה בעורך הטקסט הישן, ed, ופירוש שמה הוא:
search globally for lines matching the regular expression, and print them כלומר, אם למשל נרצה להדפיס את כל השורות בקובץ בשם input.txt המתחילות בספרה 2,3,4 או 5 נעשה זאת כך:
grep "^[2-5]" in.txt
- בתוכנת sed, נוכל למשל למחוק כל שורה ריקה או שיש בה רק רווחים (* פירושו 0 או יותר מופעים, $ פירושו סוף השורה):
sed -e '/^ *$/d' in.txt
- בשפת perl השימוש בביטויים רגולריים נמצא בשורשה של השפה וקיימת תמיכה ברמה הגבוהה ביותר בכל סוגי הביטויים. רמה זאת הפכה לסטנדרט אליו מושווה רמת התמיכה בשפות ותוכנות אחרות. הפקודה הבאה תחליף כל מקום בו מופיעה המילה grey ב-blue אך רק כאשר לאחריה (סימן שאלה והסימן שווה פירושו "הצץ קדימה") מופיעה המילה sky.
$line=~s/grey(?= sky)/blue/g
- תוכנת Oralce מאפשרת לשלב ביטויים רגולריים בשאילתות SQL החל מגרסה 10. השאילתה הבאה תציג את כל הרשומות שבהן יש במיקוד (השדה zip) סימנים כלשהם שאינם ספרות:
SELECT zip FROM zipcode WHERE REGEXP_LIKE(zip, '[^[:digit:]]')
כיום ניתן למצא תמיכה בביטויים רגולריים כמעט בכל שפת תיכנות נפוצה. במנועי חיפוש כמעט ולא מוצאים אופציות לשימוש בביטויים רגולריים אך דוגמה חיובית לכך היא מנוע החיפוש של גוגל לקטעי קוד. פירוט לגבי כל סוגי התווים המשמשים בביטויים רגולריים אפשר למצא בקישורים בתחתית ערך זה.
[עריכה] הגדרה פורמלית
בהינתן אלף בית סופי , ביטוי רגולרי מעל האלף בית מוגדר בצורה הרקורסיבית הבאה:
- (הקבוצה הריקה) היא ביטוי רגולרי, שמתאר את השפה (השפה הריקה).
- (המילה הריקה) היא ביטוי רגולרי שמתאר את השפה (השפה שמכילה רק את המילה הריקה).
- , לכל , הוא ביטוי רגולרי שמתאר את השפה .
כמו כן, אם הם ביטויים רגולריים ו- השפות המתאימות להם, אז:
- הוא ביטוי רגולרי המייצג את השפה .
- הוא ביטוי רגולרי המייצג את השפה . (כלומר, השפה שכל מילה בה מורכבת משני חלקים, שהראשון שבהם שייך ל- והשני ל-).
- הוא ביטוי רגולרי המייצג את השפה (כלומר, השפה שבה כל מילה מורכבת ממספר כלשהו - כולל 0 - של חלקים, וכל חלק שייך לשפה ).
כדי לקצר את הכתיבה ולהמעיט ככל הניתן בשימוש בסוגריים, נהוגים כללי קדימויות. סדר הקדימויות מזכיר למדי את זה שנהוג באריתמטיקה:
- סוגריים: - הפעולות שבתוך הסוגריים תמיד יתבצעו לפני הפעולות שמחוץ להן.
- איטרציה: .
- כפל: . כאשר אין חשש לבלבול משמיטים את סימן הכפל לחלוטין: .
- חיבור: .
[עריכה] דוגמאות
- הביטוי הרגולרי מסמל את השפה שבה יש מספר כלשהו של 1-ים ואחריו מספר כלשהו של 0-ים: .
- הביטוי הרגולרי מסמל את השפה שכל מילה בה מתחילה ב-1 ואחר כך כוללת רצף כלשהו של 0 ו-2, כאשר 1 יכול להופיע פעם אחת נוספת במילה.
[עריכה] הוכחת השקילות בין ביטויים רגולריים ושפות רגולריות
[עריכה] ביטוי רגולרי יוצר שפה רגולרית
הוכחת כיוון זה היא באינדוקציה פשוטה. קל להראות שהשפה הריקה וכל שפה שמכילה מילה אחת היא רגולרית, וכן שהשפות הרגולריות סגורות תחת איחוד, שרשור ואיטרציה. מכיוון שהשפה שיוצר כל ביטוי רגולרי מתקבלת על ידי ביצוע פעולות של איחוד, שרשור ואיטרציה על אבני בניין בסיסיות שהן השפה הריקה ושפות שמכילות רק מילה אחת, הכיוון נובע מייד.
[עריכה] לכל שפה רגולרית קיים ביטוי רגולרי
כיוון זה מסובך יותר. בהינתן שפה רגולרית על פי ההגדרה קיים אוטומט סופי דטרמיניסטי המקבל אותה. הביטוי הרגולרי נבנה בהתבסס על האוטומט. לצורך נוחות מסמנים את קבוצת המצבים שלו במספרים הטבעיים: , כאשר הוא המצב ההתחלתי.
לצורך ההוכחה מוגדרות שפות עזר: מוגדרת כשפת כל המילים שמעבירות את האוטומט מהמצב למצב מבלי שהמסלול ייכנס וייצא ממצב שמספרו גדול מ-. ברור כי - השפה שמקבל האוטומט היא אוסף כל המילים שמעבירות את האוטומט מהמצב הראשון למצב מקבל כלשהו, כאשר אין הגבלה על המצבים שמותר למסלול לעבור בדרך.
בשל כך מספיק להראות כיצד ניתן לקבל ביטוי רגולרי עבור השפה . הביטוי נבנה באופן רקורסיבי בהתבסס על ערכו של . כאשר השפה היא אוסף כל המילים שמעבירות את האוטומט מהמצב למצב מבלי לעבור שום מצב ביניים בדרך (שכן מספרו של כל אחד מהמצבים גדול מ-0). כלומר, מילים אלו הן אותיות או המילה הריקה. לכן לשפה קיים ביטוי רגולרי פשוט.
עבור מתבססים על האבחנה הבאה: אם מילה שייכת ל-, או שהיא מעבירה את האוטומט מ- אל מבלי לעבור במצב - ואז היא שייכת גם ל-, או שהאוטומט בריצתו על המילה כן עובר במצב מספר כלשהו של פעמים.
אם האוטומט עובר ב- ניתן לחלק את ריצתו לשלושה חלקים: הריצה עד שהוא מגיע אל לראשונה; המשך הריצה עד שהוא מגיע ל- בפעם האחרונה; והמשך הריצה עד ההגעה אל
הרישא של המילה, שמעבירה את האוטומט מ- אל שייכת לשפה , ובצורה דומה גם הסיפה של המילה, שמעבירה את האוטומט מ- אל שייכת ל-. החלק הפנימי של המילה, שגורם לאוטומט לצאת מ- ולחזור אל מספר כלשהו של פעמים שייך ל-.
מכאן נובע שאם הוא הביטוי הרגולרי המתאים לשפה , הרי שמתקיים:
- . בצורה זו ניתן לבנות ביטוי רגולרי לכל אחת מהשפות תוך התבססות על הביטויים שכבר נבנו עבור ערכים קטנים יותר של .
[עריכה] לקריאה נוספת
- שמואל זקס ונסים פרנסיז, אוטומטים ושפות פורמליות, האוניברסיטה הפתוחה, 2000.