Validation Application Block with Strippers: RegexValidator (Overview of all VAB Validators)
סדרת לומדים Validation Application Block עם חשפניות
1. קדם דבר: למה צריך וולידציה? (או: "קופים. פשוט קופים."), פורסם ב-26.6.2007
2. חלק ראשון: הפתרון הקיים והמצוי ב-Winforms, Console ו-ASP.Net (או: "איך קוראים לך ובת כמה את?"), פורסם ב-8.7.2007
3. חלק שני: שימוש ישיר ב-Validatorים של VAB (או: "איך לגרום לקוד יחסית קריא להפוך להיות ארוך ומעיק"), פורסם ב-9.7.2007
4. חלק שלישי: הכנסת נתוני הוולידטורים לתוך מחלקות (או: "ממלכתי עבור וולידטור ג'נארי"), פורסם ב-10.7.2007
5. חלק רביעי: אינטגרציה בסיסית עם ה-GUI ו-וולידציה מתוך קבצי קונפיוגרציה (או: "קצת יותר Drag&Drop, קצת פחות קוד"), פורסם ב-11.7.2007
6. חלק רביעי המשך: אינטגרציה בסיסית עם ה-GUI ו-וולידציה מתוך קבצי קונפיוגרציה (או: "קצת יותר Drag&Drop, קצת פחות קוד"), פורסם ב-12.7.2007
7. StringLengthValidator - בודקים שהכניסו שם חשפנית, פורסם ב-15.7.2007
8. RangeValidator - נו, תן ציון ל-Lap dance שקיבלת, פורסם ב-16.7.2007
9. DateTimeRangeValidator - מתי ביקרת אצלנו?, פורסם ב-17.7.2007
10. ContainsCharctersValidator ו-Negated - איך קוראים לך?, פורסם ב-18.7.2007
11. RelativeDateTimeValidator - מתי היום-הולדת שלך?, פורסם ב-22.7.2007
12. PropertyComparisonValidator ושני וולידטורים על אותו מאפיין - נבדוק שהמבקר נולד לפני שהוא ביקר במועדון, פורסם ב-24.7.2007
13. RegexValidator - בודקים את הדוא"ל של המבקר , פורסם ב-26.7.2007
14. DomainValidator - מה הסוג משקה אלכוהולי האהוב עלייך?, יפורסם ב-29.7.2007
15. ObjectValidator - מה המספר פלאפון שלך?, יפורסם ב-31.7.2007
16. ObjectCollectionValidator - מה המספרי פלאפון של החברים שלך?, יפורסם ב-2.7.2007
RegexValidator - בודקים את הדוא"ל של המבקר
אמרנו הרי שהמבקר במועדון מקבל Lap dance חינם ביום-הולדת שלו, אז חייבים דרך ליצור איתו קשר!
ודרך לשלוח לו ניוזלטר תקופתי, וניוזלטר לא תקופתי והצעה לתרופות ושעונים מזוייפים.
בשביל זה נצטרך את הכתובת דוא"ל שלו.
ניצור מאפיין מתאים בשביל הכתובת דוא"ל.
מה הבעיה עם כתובות דוא"ל? זה כבר לא חוקיות פשוטה של "מספר בין 1 ל-10" או "מחרוזת עם יותר מחמישה תווים".
יש לא מעט חוקיות עם כתובות דוא"ל וחשוב שנבין בחוקיות של מחרוזת.
כלומר, לא מדובר כאן בתוצאה חישובית כשלהי, אלא צריך לבדוק אלמנטים מסויימים במחרוזת ולראות שהם תואמים לכללים מסויימים.
בואו נראה מה החוקיות של כתובת דוא"ל:
1. בחלק הראשון (לפני סימן הכרוכית, @) מכילה לכל הפחות סימן אלפא-נומרי אחד (כולל הסימן נקודה . והסימן קו תחתון _)
2. באמצע יש את סימן הכרורכית - @
3. צריך שם דומיין שזה אומר לפחות סימן אלפא-נומרי אחד
4. נקודה . לפני סיומת דומיין.
5. סיומת לדומיין היא בין 2 ל-4 סימנים אלפא נומריים (com, net, info, uk וכך הלאה).
בואו ננסח את זה כ-Regex.
מי שזמנו יקר לו (כפי שזמני יקר לי ואני משוכנע שזמנכם יקר לכם) לא כותב Regex בפנקס רשימות.
לביטויי Regex יש סביבות פיתוח משלהן.
במאמר זה נשתמש בתוכנה The Regulator של רועי אושרוב שהיא הסטנדרט דה-פקטו לכתיבת ובדיקת Regex בדוט נט.
http://tools.osherove.com/CoolTools/Regulator/tabid/185/Default.aspx
נתרגם את הדרישות הטכניות שכתבנו לכתובת דוא"ל לביטוי Regex.
Regex מתחיל עם הסימן ^ ומסתיים עם הסימן $ כאשר אנחנו רוצים שכל הביטוי שהוזן יעבור וולידציה ולא רק חלקים ממנו.
אמרנו שאנחנו רוצים שבאמצע יהיה סימן הכרוכית @ אז נכתוב אותו.
נרצה שלפני סימן הכרוכית יהיה רצף של אותיות, מספרים, הסימן נקודה . והסימן קו תחתון _.
ב-Regex הסימן w\ מסמן רצף אלפא-נומרי והסימן קו תחתון _, אבל לא הסימן נקודה.
את הסימן נקודה נסמן באמצעות .\ (סלאש ונקודה).
את העובדה שמדובר ברצף חוזר על עצמו נסמן עם בכך שנכתוב את שני הביטויים בתוך סוגריים מרובעות [ ].
אנחנו רוצים שהרצף יחזור על עצמו לכל הפחות פעם אחת אז נסמן את הרצף עם הסימן פלוס + שנועד לסמן כי הרצף שלפניו חוזר 1+ פעמים.
אחרי סימן הכרוכית @ נרצה שיופיע כל רצף אלפא נומרי עם הסימנים נקודה וקו תחתון.
הרצף הזה צריך לחזור על עצמו גם לפחות פעם אחת.
עכשיו נרצה להוסיף מקום עבור סיומת הדומיין com. או net. וכך הלאה. צריך נקודה אחת לפחות בכל הביטוי הזה.
נשתמש בסימן .\ שהכרנו כדי לסמל נקודה ונציין אחריה באמצעות {1} שמדובר בדיוק במופע אחד בדיוק של נקודה.
בתור הסיומת עצמה מותר כל סימן אלפא נומרי בין 2 ל-4 אותיות.
את הסימן w\ אנחנו מכירים, ונשתמש ב-{2,4} כדי לסמן שמדובר בין 2 ל-4 סימן.
וזהו.
נבדוק בתוך The Regulator את הביטויים הבאים שנצפה שיהיה בסדר: J@JustinAngel.Net, Israel@Israel.co.il
ונבדוק גם את הביטויים שלא אמורים לעבור: @, a@a, @a.com
כתבנו את הביטוי הרגולרי שלנו בתוך החלון המרכזי.
בצד הימני התחתון תחת Input כתבנו את הקלטים שאנחנו רוצים לבדוק.
לחצנו על כפתור Match (מודגש בקו אדום) ונקבל בחלק השמאלי התחתון את כל המחרוזות שהתאימו ל-Regexp שלנו.
ואכן, הביטוי מתאים רק לכתובות הוולידיות שלנו ולא קיבל את הכתובות החלקיות.
נוסיף למאפיין דוא"ל שלנו RegexValidator.
ונראה כי נוכל לכתוב ישירות לתוכו את ה-Regex שלנו.
אם היינו רוצים היינו יכולים לפרט RegexOptions וזה קצת יותר קשור ל-Regex מאשר למאמר הזה, נסתפק ונאמר שהברירת מחדל מספיקה למרבית המצבים.
נראה איך היינו מוסיפים את הוולידטור הזה דרך עורך הקונפיוגרציה הגרפי.
ומולנו ה-XML שיצר כלי הקונפגיורציה הגרפי בתוך קובץ BL.config:
אגב, שמתם לב לשלוש נקודות מצד ימין למאפיין Pattern? אם נלחץ עליו נקבל את התיבת עריכה ברירת המחדל של VS2005 ל-Regex.
כאן נקבל מספר אפשרויות ל-Regexים מוכנים שנשלחים עם VS2005.
נראה באמת שה-GUIים שלנו מקיימים את החוקיות שהכתבנו.
חשוב לשים Wלב לכוח העצום מאחורי Regex היות ואנחנו יכולים להביע באמצועתם כל לוגיקה הקשורה לתוכן של מחרוזת.
נראה עוד כמה ביטויי Regex לדוגמה מתוך האתר RegexLib.com.
| Regex | תיאור |
| ^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$ | בודק כתובות IP 1.1.1.1 255.255.255.255 |
| <script[^>]*>[\w|\t|\r|\W]*</script> | מחפש תגיות <script> ב-HTML |
| ^\{?[a-fA-F\d]{8}-([a-fA-F\d]{4}-){3}[a-fA-F\d]{12}\}?$ | תואם ל-GUIDים. e02ff0e4-00ad-090A-c030-0d00a0008ba0 {e02ff0e4-00ad-090A-c030-0d00a0008ba0} |
| ^0(5[012345678]|6[47]){1}(\-)?[^0\D]{1}\d{5}$ | אימות מספרי פלאפון בישראל. 0520-346634 0528633633 064-2228226 |
| ^(\+[1-9][0-9]*(\([0-9]*\)|-[0-9]*-))?[0]?[1-9][0-9\- ]*$ | מספרי טלפון בין לאומיים. +123(45)678-910 +123-045-67 89 10 01-234-56-78 |
הערכה חשובה, להדוגמה שנתנו כאן לאימות דוא"ל היא לפי סט כללים מעניין שמספיק לרוב סוגי כתובות הדוא"ל, אבל לא לכולם. ישנו תקן RFC 2822 לכתובות דוא"ל וניתן למצוא מימוש שלו ב-Regex בכתובת הבאה - http://www.regular-expressions.info/email.html.
יש עוד המון דוגמאות ושימושים אפשריים ל-Regex, מה שחשוב לזכור זה שלא צריך לפחד מלהשתמש ב-Regex שצריך את העוצמה שלו.