regular expression על קצה הפוסט – חלק שלישי

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

זוכרים את ההדגמה שלי של "Hello World" ?

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

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

/^([a-zA-Z]{5})/

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

/^([a-zA-Z]{2})[:space:]/

כאן זה שאני מחפש 2 תווים שאחרים יש רווח, עוזר למנוע להבין שאני מחפש את התווים לפני הרווח, אבל לא מהתחלת המחרוזת/שורה.
עכשיו אציג לכם regex דומה, אבל קצת שונה:

/([a-zA-Z]{2}[^[:space:]])[:space:]/

כאן הRegex יחזיר 3 תווים, ולשני תווים אשר מגיעים לפני הרווח. מדוע אתם בטח שואלים ?
ובכן, ההגדרה אומרת להביא אחורה עוד 2 תווים לפני הרווח, ולא 2 תווים אחרי הרווח.

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

/([a-zA-Z]{2}[^[:space:]]/

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

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

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

(([0-9]{1,3}\.){3}([0-9]{1,3}))

כאן אני אומר למנוע לתפוס כל ספרה מ0-9 שמופיע לפחות פעם אחת ועד שלוש פעמים. אחריה כנראה תבוא נקודה, כל זה חייב להופיע 3 פעמים. לאחר מכן, חוק שאמור לתפוס עוד מקום של ספרה אחת עד 3 ספרות.
החוקים האלו, מוקפים בקבוצה אחת, אבל כל חוק כזה, נמצא בקבוצה משל עצמו. ובכך 3 הסיגמנטים הראשונים יופיע בקבוצה מספר 2, והסיגמנט האחרון בקבוצה 3, אך במידה ונרצה את כל הסיגמנטים הם יהיו בקבוצה מספר 1.
שימו לב, כי החוקים אינם מסבירים את מבנה הבתים שכל מיקום מציין (סה"כ זה מספר שלם באורך 32 ביט ללא סימן), אלא רק כיצד לזהות את המידע עצמו.

איך ממשיכים מכאן ? ובכן, כמו שהכותרת מציגה, זה רק קצה המזלג בנושא. יש עוד המון מה ללמוד.
ישנם עוד תחבירים נוספים של Regex, חלקם אף מקלים יותר על העבודה (שימוש בקיצורים לclass למשל), וכן מכניסים תכונות רבות יותר (כדוגמת חיפוש אחורה, יצירת מחלקות משל עצמינו ועוד).
אחד התחבירים החשובים מאוד בנושא, נקרא תחביר פרל – PCRE (הזכרתי את דבר קיומו בחלק הראשון) והוא סוג של סמן להרבה שפות אחרות, כדוגמת Javascript, Ruby ושפות נוספות אשר משתמשות בו כסוג של בסיס, וחלקן אף מוסיפות לו תכונות נוספות.
מקור נוסף טוב להמשיך ללמוד את הנושא, הוא אתר המתמחה בלימוד Regular Expression.

3 מחשבות על “regular expression על קצה הפוסט – חלק שלישי

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s