בולנט - דברים מיוחדים...     פרוטו - בניית אתרים

Israeli ASP Organization

ארגון ה-ASP הישראלי

מאמרים/דוגמאות קוד
קישורים
ספרות
חיפוש כללי:

חפש!
כלליHTMLASPASP.NETSQLמסדי נתוניםJavaScriptXML * XSLDHTML * CSSעיצוב וגרפיקהשרתיםComponentsפרסום ושיווקקידום אתריםקופירייטינגPHP
פרסומת
דף ראשי מדורים דרושים הרשמה למועדון אודותינו צור קשר
מיקום: מאמרים ודוגמאות קוד > ASP > VBScript
מיקום: מאמרים ודוגמאות קוד > ASP

ביטויים רגילים (regular expressions)

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

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

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

re זה בעצם מחרוזת אשר משמשת לייצוג תבנית מסובכת או מחרוזת פשוטה. למשל re אשר מטרתו לייצג תבנית של 2 או 3 מספרים עוקבים יראה כך: d{2,3}
אל תיבהל אם התבנית נראית לך כמו גיבריש, כבר אסביר איך מסתכלים על זה.

בגרסת ה-vbscript scripting engine 5.0 (אותו ניתן להוריד בחינם מ-http://msdn.microsoft.com/scripting) הוסיפו ל-vbscript את אובייקט ה-re אשר נקרא: regexp.
לאובייקט יש 3 מאפיינים:

pattern - אשר מהווה את משפט ה-re עצמו.
ignorecase - ערך בוליאני אשר מורה האם להתעלם מהבדלי הגדלים בין האותיות או לא.
global - ערך בוליאני אשר מורה האם למצוא את כל התת-מחרוזות התואמות את ה-re או רק את התת-מחרוזת הראשונה.

לאובייקט יש גם 3 מטודות:
test - מחזיר ערך בוליאני true במידה והתת-מחרוזת אותה מקבל נמצאה בתוך במחרוזת או ערך false במידה ולא.
replace - אותו דבר כמו מטודת test אך במקום להחזיר ערך בוליאני, היא מחליפה את כל הערכים שנמצאו בתת-מחרוזת אשר מגדירים לו.
execute - אשר מקבלת תת-מחרוזת לחיפוש ומחזירה אוסף (collection) של כל התת-מחרוזות התואמות את ה-re.

תאימות לפי מיקום

ניתן להשתמש ב-re בכדי למצוא תת-מחרוזת מסויימת במיקום בתוך מחרוזת, למשל אם ברצוננו לקבוע האם מחרוזת מסויימת מתחיל בתת-מחרוזת "adam", היה עלינו להשתמש בקוד הבא:

<% dim objregexp set objregexp = new regexp objregexp.ignorecase = true objregexp.pattern = "^adam" dim strstringtosearch strstringtosearch = "adam liwski is my name." objregexp.test(strstringtosearch) adam-מכיוון שהמחרוזת מתחילה ב true יחזיר ערך set objregexp = nothing לא לשכוח לנקות %>

יש לזכור כי מטודת ה-test מקבלת כפרמטר רק את התת-מחרוזת אותה עליו לחפש לפי ה-re אשר מוגדר המאפיין ה-pattern של אובייקט ה-regexp.
re מאפשרת לנו שימוש בארבעה סימנים מיוחדים בשביל לחפש תבניות או תת-מחרוזות ואף מיקום יחסי. להלן טבלה אשר תראה למה משמש כל סימן:

סימןתאור
^ תואם את ה-re רק בתנאי שהוא נמצא בתחילת תת-המחורת אותה מחפשים
$ תואם את ה-re רק בתנאי שהוא נמצא בסוף תת-המחורת אותה מחפשים
 מאפשר לוודא כי ה-re ימתא רק מילים יחידות ולא יחזיר תת-מחרוזות שנמצאו בתוך מילה אחרת.
למשל, המילה "גדר" נמצאת בתוך המילה "גדרה" ולכן אם נשתמש בסימן  המילה לא תחשב כתואמת.
b ההפך מ-. תואם אך ורק תת-מחרוזות אשר נמצאות בתוך מילים.

ניתן להשתמש בסימנים ^ ו-$ בכדי לחפש מחרוזת שלמה. לדוגמא: אם היינו רוצים לקבוע האם מחרוזת מכילה ספרה אחת וזזהו היינו משתמשים במשפט ה-re הבא: ^d$
ה-d כמו שנראה בקרוב, מתאים לכל ספרה עשרונית בין 0 ל-9
ללא הסימנים ^ ו-$ ה-re היה תואם כל מספר עשרוני שהיה בתוך המחרוזת שבה היינו מחפשים.

הערה: כאשר משתמשים ב-re יש לזכור כי הביטויים הינם case sensitive ואם נתבלבל ובמקום אות קטנה נכתוב אות גדולה או להפך, בדרך כלל נקבל תוצאה הפוכה למה שנחפש.

קבוצות תווים

ב-re ישנם מספר סימנים מיוחדים המאפשרים חיפוש של קבוצות תווים. הדוגמא הנפוצה ביותר היא הסוגריים המרובעים [ ]. אלו מאפשרים חיפוש של תווים מסויימים, לדוגמא אם היינו רוצים לקבוע אם במחרוזת מסויימת ישנן אותיות a,e,o,i,u, היינו משתמשים ב-re הבא: [aeoiu]

הערה: יש לזכור כי הסוגריים המרובעים מתייחסים להופעת תווים בודדים ולא תת-מחרוזות.

במידה וברצוננו לקבוע אם מחרוזת מסויימת אינה כוללת אותיות a,o,e,i,u, כל מה שנצטרך לעשות הוא להוסיף ^ (shift+f6) לפני רשימת התווים בסוגריים המרובעים, לדוגמא: [aeoiu^]

אם ברצוננו לחפש אותיות או מספרים בטווח מסויים, ניתן להשתמש בסימן מקף (-) אשר מסמל טווח. למשל, אם ברצוננו לחפש מילה בה לא מופיעות אף אותיות קטנות באנגלית, אזי ה-re היה נראה כך: [^a-z]

ישנו גם הסימן המיוחד נקודה (.) אשר מסמל תו בודד כלשהו. למשל a.dam יהיה תואם למילים כמו: adam, agam, a6am

אם ברצוננו למצוא מילה שלמה אשר כוללת תווים אלפא-נומרים (תווים אלפא-נומרים מיוצגים בעזרת ה-re הבא: [a-za-z_0-9]) עלינו להשתמש בסימן w וניתן להשתמש אף בהפך, w אשר מסמל מילה שאינה כוללת תווים אלפא-נומרים ([^a-za-z_0-9])

כמו שהזכרנו מקודם, d תואם סיפרה, ומקביל לביטוי [0-9]. ההפך ממנו הוא: d אשר תואם תו שאינו סיפרה והוא מקביל ל- [^0-9].

הסימן s תואם תווי רווח (whitespace) אשר כוללים את הסימן רווח, שורה חדשה (new line אשר מיוצג כ- ), סימן carraige return אשר מסמל חזרת הדיו במדפסת ( ) או טאב ( )
וכרגיל, ישנו גם הסימן s אשר תואם כל תו שאינו תו רווח.

קבוצות תווים הינם דבר מאוד שימושי לחיפוש תבניות מסובכות,
למשל אם ברצוננו לבדוק אם מספר טלפון הינו תקין ונאמר שבכדי שיהיה תקין, עליו להיות בפורמט ##-#######
אזי אנו יכולים להשתמש ב-re הבא: ^dd-dddddd$

אם ברצוננו לוודא כתיבתם של תווי סימון (כמו סוגריים, נקודה, סימשן שאלה, סימון קריאה, ועוד..) כל שעלינו לעשות הוא לכתוב לפני הסימנים את הסימן "" (backslash).

קבוצות התווים יכולות להשיות שימושיות ביותר כאשר אנו רוצים לאמת נתונים בטפסים.

חזרות

ישנם מספר תווים המשמשים לחיפוש חזרות של תבניות או תת-מחרוזות, בניהם ניתן למצוא את הסוגריים המסולסלים ({n}) אשר מחפשים n חזרות של התת-מחרוזת / תבנית שבאים לפניהם, לדוגמא: לחיפוש 3 ספרות צמודות, ניתן להשתמש ב-re הבא: d{3}
הסוגריים המסולסלים יכולים לקבל גם עוד משתנה בצורה הבאה: {n,p} המאפשר חיפוש בין טווחים כאשר השמתנה הראשון (n) מסמל את הגבול התחתון והמשתנה השני (p) מסמל את הגבול העליון. לדוגמא לחיפוש של 4 עד 6 אותיות a,o,u,i,e ברצף, ניתן להשתמש ב-re הבא: [aouie]{4,6}
ניתן גם להשתמש בצורה זו ללא המשתנה השני (הגבול העליון) שך להשאיר את הפסיק המפריד ומה שיקרה זה שה-re יהיה ואם ל-n פעמים או יותר של הופעת המחרוזת / תבנית שלפני הסוגריים המסולסלים.
לדוגמא, אם ברצוננו לחפש 3 ספרות רצופות או יותר, ניתן להשתמש ב-re הבא: [0-9]{3,}

סימן השאלה (?) תואם 0 הופעיות או 1 של תו כלשהו, לש משנה סוגו. (מקביל לביטוי {0,})
סימן הכוכבית (*) תואמת 0 הופעות של תו מסויים או יותר. (לאו דווקא אותו תו) ומקבילה לביטוי {0,}
סימן ועוד (+) תואם הופעה 1 לפחות או יותר והינו מקביל לביטוי {1,}

חזרות זה דבר מאוד שימושי גשר משתמשים ב-re ובדוגמא אותה הצגנו קודם, של בדיקת הטלפון, נוכל להשתמש גם בחזרות בצורה הבאה: ^d{2}-d{6,7}$
יש לשים לב שבדוגמא זו אפשרנו 6 או 7 ספרות לא כולל קידומת, אשר חייבת להיות בת 2 ספרות.

אם ברצוננו להכריז חלק ממחרוזת כאופציונאלי כל שעלינו לעשות הוא לתחום חלק זה בסוגריים ולהצמיד בסופם את סימן השאלה. בדוגמא זו נראה את דוגמאת הטלפון רק שעכשיו נכריז על חלק הקידומת כאופציונאלי: ^(d{2}-)?d{6,7}$



         

מחבר: אדם ליבסקירמת קושי: 2  ||  ציון: (6.75)כל הזכויות שמורות ל-IAO ©

חנות לסטלן  |   מתכונים  |   חגי ישראל  |   פורטל משחקים  |   חנויות מחשבים ו-ציוד הקפי  |   מגזין מסטול לסטלן המצוי  |   קליפרים  |   גידול צמחים פרחים  |   ספא פינוק מושלם