עולם המתכנתים מתחלק לשלושה חלקים:
- אלו אשר משתמשים ב Regex
- אלו אשר שמעו על Regex
- אלו שחושבים שאני מקלל אותם כרגע
פוסט זה נכתב עבור האנשים שרק שמעו קצת על הנושא, ואלו שבכלל לא.
Regular Expression או Regex כקיצור, זו למעשה שפה המאפשרת לתאר תבנית מסויימת של טקסט שרוצים למצוא או לשנות.
ישנן הרבה מימושים לשפה, כאשר כל מימוש מספק יכולות שונות – בעיקר תוספות למימוש הבסיסי ביותר. אחת הידועות ביותר נקראת Perl Compatible Regular Expression או PCRE בקיצור .אך התקן הבסיסי ביותר שיש עבור השפה, בכלל שייכת לPOSIX.
לעין בלתי רגילה, הקוד נראה כמו אסופה של ג'יבריש, אבל ככול שמבינים יותר את השפה, קל יותר להבין אותה (אלא אם מתעללים בה), אבל לוקח לעיניים כל פעם מחדש קצת זמן להתרגל לתחביר.
המטרה של Regex היא למצוא מבנה (תבנית) בעל חוקיות מסויימת אשר בכל דרך אחרת, תהיה זו משימה מסובכת יותר לגילוי. העניין הוא, שregex במידה והמבנה ידוע מראש, אינו יהיה יעיל כמו חילוץ מידע בצורה לינארית. ועל כן השימוש בRegex נבנה עבור השימוש בתבניות, ומומלץ לא להשתמש בו עבור משהו פשוט יותר.
למשל, במידה ואנחנו בהכרח יודעים כי המחרוזת תראה כך:
Hello World
כלומר, אנחנו מחפשים מבנה מחרזות שהיא בהכרח תהיה Hello World (כאשר H גדולה, השאר אותיות קטנות, אז רווח ואז W גדולה, והשאר אותיות קטנות), אז השימוש ב Regex אינו יעיל, היות והוא אינו תורם לנו שום דבר מיוחד בנושא, למרות שניתן להשתמש בו במקרה זה. אך החיפוש הרגיל של מחרוזות בהכרח יהיה יעיל ומהיר יותר בנושא.
לעומת זאת, כאשר נרצה לדעת האם מדובר באוסף אותיות (אפילו התחלה באות גדולה בכל התחלת "מילה"), רווח, ועוד אוסף אותיות (שוב פעם עם אות גדולה), אז דווקא לRegex יתרון ברור, היות ואנחנו מחפשים תבנית, ולא אסופת תווים מדוייקת. שימוש ב Regex בסיסי לשם כך יראה בצורה הבאה:
^([\w]+)\s([\w]+)$
נראה כמו ג'יבריש אני יודע. בפוסט הבא אסביר גם מה המשמעות.
המראה הבסיסי של השפה מתארת מספר דברים:
מבנה | תאור |
---|---|
. | נקודה – מציין תו בודד בנקודה בה היא מונחת |
[ ] | סוגריים מרובעים – אוסף של סוגי תווים הצריכים להיות במקום בו נכתבו הסוגריים |
[ ^] | סוגריים מרובעים עם גג – שלילה של אוסף תווים הנמצאים במקום. כלומר תווים שאסור להם להיות בנקודה הזו. במידה ומדובר בהחלפה, אז זה אומר כי כל תו אשר אינו מופיע כאן יוחלף |
^ | גג – ציון התחלת שורה/מחרוזת. |
$ | דולר – ציון סוף שורה/מחרוזת. |
( ) | סוגריים עגולים – ציון קבוצה אשר מאגדת בתוכה אוסף חוקים שצריך להתקיים בה |
{n} | סוגריים מסולסלים – ציון מספר מדוייק של חזרות לחוק מסויים |
{,n} | סוגריים מסולסלים עם מספר ופסיק – ציון של מספר חזרות שהוא *לפחות* כמספר הרשום |
{m,n} | סוגריים מסולסלים, מספר, פסיק, מספר – כמות חזרות מינימלית של n אבל לא יותר מאשר m פעמים |
* | כוכבית – אפס חזרות או יותר של חוק מסויים |
? | סימן שאלה – חזור אפס פעמים או פעם אחת |
+ | סימן פלוס – חזור פעם אחת או יותר |
| | סימן Pipe – בחירה של מספר אפשרויות כאשר הסימן מפריד בניהם |
– | מינוס – נמצא בשימוש רק בתוך אוסף תווים ומציין טווח "מ" ו"עד" עם תווים |
בפרק הבא אתחיל לכתוב קצת יותר מידע מעשי בנושא
נחמד מאוד.
ברשומה הבאה ספר טיפה יותר על הרקע לשם PCRE 🙂
וקשר לחקצד 208. נו, אי אפשר בלי זה.
ואל תספר את הבדיחה על שתי בעיות. כן אפשר בלי זה.
תודה. אני בכוונה מדבר רק על POSIX REGEX ולא על PCRE
חוצמזה, שיש כמה מפרשי Regex חזקים יותר ממנו כיום 😦
ולגבי הבדיחה, זה לא היה לטובת הבדיחה, אלא להסביר עבור מי הפוסט 🙂
נראה לי שלא הבנת אותי: לא סיפרת את הבדיחה. רק ביקשתי שלא תספר בעתיד. היא נדושה מדי.
הסברת טוב עבור מי אתה כותב.
אה, אוקי, אשתמש בטרינארי במקום 😛
תודה
או כמו שהזכרתי בהרצאה על salt: "אם אתה יודעים regex, תנחומי. אם לא, מצבכם גרוע יותר".
נקודה מציינת כל תו חוץ מתו שורה חדשה
פינגבק: regular expression על קצה הפוסט – חלק שני | לראות שונה
פינגבק: רשומות DNS עבור SIP | לראות שונה