DCSIMG
Validation Application Block with Strippers: RegexValidator (Overview of all VAB Validators) - Justin myJustin = new Justin( Expriences.Current );

Validation Application Block with Strippers: RegexValidator (Overview of all VAB Validators)

image

 

סדרת לומדים 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 חינם ביום-הולדת שלו, אז חייבים דרך ליצור איתו קשר!
ודרך לשלוח לו ניוזלטר תקופתי, וניוזלטר לא תקופתי והצעה לתרופות ושעונים מזוייפים.
בשביל זה נצטרך את הכתובת דוא"ל שלו.

ניצור מאפיין מתאים בשביל הכתובת דוא"ל.

        private string _email;

 

        public string EMail

        {

            get { return _email; }

            set { _email = value; }

        }

מה הבעיה עם כתובות דוא"ל? זה כבר לא חוקיות פשוטה של "מספר בין 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 מתחיל עם הסימן ^ ומסתיים עם הסימן $ כאשר אנחנו רוצים שכל הביטוי שהוזן יעבור וולידציה ולא רק חלקים ממנו.

image_thumb1

אמרנו שאנחנו רוצים שבאמצע יהיה סימן הכרוכית @ אז נכתוב אותו.

image_thumb2

נרצה שלפני סימן הכרוכית יהיה רצף של אותיות, מספרים, הסימן נקודה . והסימן קו תחתון _.
ב-Regex הסימן w\ מסמן רצף אלפא-נומרי והסימן קו תחתון _, אבל לא הסימן נקודה.
את הסימן נקודה נסמן באמצעות .\ (סלאש ונקודה).

image_thumb3

את העובדה שמדובר ברצף חוזר על עצמו נסמן עם בכך שנכתוב את שני הביטויים בתוך סוגריים מרובעות [ ].

image_thumb4

אנחנו רוצים שהרצף יחזור על עצמו לכל הפחות פעם אחת אז נסמן את הרצף עם הסימן פלוס + שנועד לסמן כי הרצף שלפניו חוזר 1+ פעמים.

image_thumb5

אחרי סימן הכרוכית @ נרצה שיופיע כל רצף אלפא נומרי עם הסימנים נקודה וקו תחתון.

image_thumb6

הרצף הזה צריך לחזור על עצמו גם לפחות פעם אחת.

image_thumb7

עכשיו נרצה להוסיף מקום עבור סיומת הדומיין com. או net. וכך הלאה. צריך נקודה אחת לפחות בכל הביטוי הזה.
נשתמש בסימן .\ שהכרנו כדי לסמל נקודה ונציין אחריה באמצעות {1} שמדובר בדיוק במופע אחד בדיוק של נקודה.

image_thumb8

בתור הסיומת עצמה מותר כל סימן אלפא נומרי בין 2 ל-4 אותיות.
את הסימן w\ אנחנו מכירים, ונשתמש ב-{2,4} כדי לסמן שמדובר בין 2 ל-4 סימן.

image_thumb9

וזהו.
נבדוק בתוך The Regulator את הביטויים הבאים שנצפה שיהיה בסדר: J@JustinAngel.Net, Israel@Israel.co.il
ונבדוק גם את הביטויים שלא אמורים לעבור: @, a@a, @a.com

image_thumb10

כתבנו את הביטוי הרגולרי שלנו בתוך החלון המרכזי.
בצד הימני התחתון תחת Input כתבנו את הקלטים שאנחנו רוצים לבדוק.
לחצנו על כפתור Match (מודגש בקו אדום) ונקבל בחלק השמאלי התחתון את כל המחרוזות שהתאימו ל-Regexp שלנו.

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

נוסיף למאפיין דוא"ל שלנו RegexValidator.

image_thumb11

ונראה כי נוכל לכתוב ישירות לתוכו את ה-Regex שלנו.

        private string _email;

        [RegexValidator(@"^[\w\.]+@[\w\.]+\.{1}(\w{2,4})$",

                        MessageTemplate="Email is not valid")]

        public string EMail

        {

            get { return _email; }

            set { _email = value; }

        }

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

נראה איך היינו מוסיפים את הוולידטור הזה דרך עורך הקונפיוגרציה הגרפי.

image_thumb12

image_thumb13

ומולנו ה-XML שיצר כלי הקונפגיורציה הגרפי בתוך קובץ BL.config:

          <property name="EMail">

            <validator pattern="^[\w\.]+@[\w\.]+\.{1}(\w{2,4})$" options="None"

              patternResourceName="" patternResourceType="" messageTemplate="Email is not valid"

              messageTemplateResourceName="" messageTemplateResourceType=""

              tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RegexValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

              name="Regex Validator" />

          </property>

אגב, שמתם לב לשלוש נקודות מצד ימין למאפיין Pattern? אם נלחץ עליו נקבל את התיבת עריכה ברירת המחדל של VS2005 ל-Regex.
כאן נקבל מספר אפשרויות ל-Regexים מוכנים שנשלחים עם VS2005.

image_thumb14

נראה באמת שה-GUIים שלנו מקיימים את החוקיות שהכתבנו.

image_thumb15

image38

 

חשוב לשים 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 שצריך את העוצמה שלו.

 

Comments

No Comments