מבוא לביטויים רגולריים

הקדמה

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

ביטויים רגולריים הם תבניות להתאמת תבניות (או לפעמים לא להתאים תבניות). הם מספקים דרך לתאר ולנתח טקסט. מדריך זה יעניק הבנה לגבי ביטויים רגולריים מבלי להיכנס לפרטיות של שפה כלשהי. פשוט נשתמש ב־egrep כדי להסביר את המושגים.

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

ביטויים רגולריים מורכבים משני סוגי תווים:

  • התווים הרגילים הליטרליים ו

  • התווים המטא

הם אלה שנותנים כוח לביטויים רגולריים.

שקול הקובץ country.txt הבא בו העמודה הראשונה היא שם המדינה, השנייה הוא אוכלוסיית המדינה והשלישית היא היבשת.

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

מטא-תווים עוגן

הקבוצה הראשונה של "מטא-תווים" שנדון היא ^ ו־$. ^ ו־$ מתאימים לתחילת ולסוף של דפוס בהתאמה ונקראים מטא-תווי עוגן.

כדי למצוא את שמות המדינות שבהן שם המדינה מתחיל באות I, אנו משתמשים בביטוי:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

או כדי למצוא את כל המדינות ששמות היבשות שלהן מסתיימים ב־e, אנו עושים:

$ egrep 'e$' country.txt
Italy,57634327,Europe

המטא-תו הבא הוא הנקודה (.), המתאים לתו אחד. כדי להתאים לכל השורות שבהן שם המדינה בדיוק 5 תווים ארוכים:

$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia

מה לגבי מציאת כל השורות שבהן שם המדינה מתחיל באו או ב־J ושם המדינה באורך 5 תווים?

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

[…] נקרא קבוצת תווים או מחלקת תווים. בתוך קבוצת תווים נתונים רק אחד מהתווים שניתנו יתאימו.

תו ^ בתוך קבוצת התווים מפריד את קבוצת התווים. הדוגמה הבאה תתאים לשמות מדינה באורך חמישה תווים אך לא מתחילים באו או J.

$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

התו המקבץ והאלטרנטיבה

כדי להתאים לכל השורה המכילה את אסיה או אפריקה:

$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

זה יכול להתבצע גם על ידי לקיחת א ו־א כלליים.

$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

כמותיים

במקום לכתוב

$ egrep '^[IJ]....,' country.txt

אנו יכולים לכתוב

$ egrep '^[IJ].{4},' country.txt

כאשר {} נקראים כמותיים. הם קובעים כמה פעמים התו לפניהם צריך להופיע.

אנו יכולים לתת טווח גם:

$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

זה יתאים לשמות מדינות שמתחילים באי או ג' ויש ביניהם 4 עד 6 תווים.

קיימים כמה קיצורים זמינים לכמותיים. לדוגמה,

{0,1} שקול ל־?

$ egrep '^ab{0,1}c$' filename

הוא אותו דבר כמו

$ egrep '^ab?c' filename

{0,} שקול ל־*

$ egrep '^ab{0,}c$' filename

הוא אותו דבר כמו

$ egrep '^ab*c' filename

{1,} שקול ל־+

$ egrep '^ab{1,}c$' filename

הוא אותו דבר כמו

$ egrep '^ab+c' filename

בואו נראה כמה דוגמאות הכוללות את הביטויים שראינו עד כה. כאן במקום לחיפוש מקובץ, אנו מחפשים מקלט סטנדרטי. התרומה שאנו משתמשים בה היא שאנו יודעים ש־grep (או egrep) מחפש אחר דפוס, ואם נמצא דפוס, אז השורה השלמה המכילה את הדפוס מוצגת.

אנו רוצים למצוא את כל הדרכים האפשריות לכתוב את המשפט the grey colour suit was his favourite.

הביטוי יהיה:

$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite

מבט על הביטוי לעיל מראה ש:

  • grey ניתן לכתוב כ grey או gray

  • colour ניתן לכתוב כ colour או color, כלומר אות ה-U אופציונלית, לכן אנו משתמשים ב־u?

  • באופן דומה favourite או favorite ניתן לכתוב favou?rite

מה עם התאמת מיקוד מרכזים ארה"ביים?

$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345

דוגמה נוספת להתאמת כל השעות התקפות בשעון 24 שעות.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33

בדוגמה לעיל אמרנו כי, אם הספרה הראשונה של השעה היא או 0 או 1, אז השנייה תהיה כל אחת מ-0 עד 9. אבל אם הספרה הראשונה היא 2, אז הערכים המותרים לספרה השנייה הם 0, 1, 2 או 3.

גבול מילים

כדי לכתוב תבנית התואמת למילים שמסתיימות ב-color, כגון unicolor, watercolor, multicolor וכו', אך לא colorless או colorful. נסו את הדוגמאות האלה בעצמכם כדי להתנסות בהן:

$ egrep 'color\>'

בנוסף, כדי להתאים את colorless ו־colorful, אך לא unicolor, watercolor, multicolor וכו'.

$ egrep '\<color'

כך להתאים את המילה הדיוקת color, אנו עושים:

$ egrep '\<color\>'

הפניות לאחור

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

להלן דוגמה:

$ egrep "\<the\> \1"

או בדרך הכללית:

$ egrep "\<(.*)\> \1"

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

זו רק הקדמה לעוצמתן של ביטויים רגולריים.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions