אמת מספרי טלפון באמצעות Java Regex

1. סקירה כללית

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

2. ביטויים רגילים לאימות מספרי טלפון

2.1. מספר בן עשר ספרות

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

@ מבחן ציבורי בטל כאשרMatchesTenDigitsNumber_thenCorrect () {תבנית תבנית = תבנית.קומפילציה ("^ \ ד {10} $"); התאמת התאמה = דפוס. התאמה ("2055550125"); assertTrue (matcher.matches ()); }

ביטוי זה יאפשר מספרים כמו 2055550125.

2.2. מספר עם רווחים לבנים, נקודות או מקפים

בדוגמה השנייה, בואו נראה איך אנחנו יכולים אפשר מרחב לבן, נקודות או מקפים אופציונליים (-) בין המספרים:

@ מבחן ציבורי בטל כאשרMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect () {Pattern pattern = Pattern.compile ("^ (\ d {3} [-.]?) {2} \ d {4} $"); התאמת התאמה = דפוס. התאמה ("202 555 0125"); assertTrue (matcher.matches ()); }

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

  • [- .]?

דפוס זה יאפשר מספרים כמו 2055550125, 202 555 0125, 202.555.0125, ו 202-555-0125.

2.3. מספר עם סוגריים

לאחר מכן, בואו נוסיף את האפשרות לקבל את החלק הראשון של הטלפון שלנו בין סוגריים:

@ מבחן ציבורי בטל כאשרMatchesTenDigitsNumberParenthesis_thenCorrect () {Pattern pattern = Pattern.compile "^ ((\ (\ d {3} \)) | \ d {3}) [-.]? \ d {3} [-.]? \ ד {4} $ "); התאמת התאמה = דפוס. התאמה ("(202) 555-0125"); assertTrue (matcher.matches ()); }

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

  • (\ (\ d {3} \)) | \ d {3})

ביטוי זה יאפשר מספרים כמו (202)5550125, (202) 555-0125 אוֹ (202)-555-0125. בנוסף, ביטוי זה יאפשר גם את מספרי הטלפון המכוסים בדוגמה הקודמת.

2.4. מספר עם קידומת בינלאומית

לבסוף, בואו נראה איך אפשר קידומת בינלאומית בתחילת מספר טלפון:

@ מבחן ציבורי בטל כאשרMatchesTenDigitsNumberPrefix_thenCorrect () {Pattern pattern = Pattern.compile ("^ (\ + \ d {1,3} ()?)? ((\ (\ d {3} \)) | \ ד {3}) [-.]? \ ד {3} [-.]? \ ד {4} $ "); התאמת התאמה = דפוס. התאמה ("+ 111 (202) 555-0125"); assertTrue (matcher.matches ()); } 

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

  • (\ + \ ד {1,3} ()?)?

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

3. החלת ביטויים רגולריים מרובים

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

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

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

בואו נראה דוגמה בה אנו משתמשים בביטויים הבאים:

  • הביטוי ששימש בחלק האחרון:
    • ^ (\ + \ d {1,3} ()?)? ((\ (\ d {3} \)) | \ d {3}) [-.]? \ d { 3} [-.]? \ ד {4} $
  • ביטוי רגולרי כדי לאפשר מספרים כמו +111 123 456 789:
    • ^ (\ + \ d {1,3} ()?)? (\ d {3} []?) {2} \ d {3} $
  • תבנית כדי לאפשר מספרים כמו +111 123 45 67 89:
    • ^ (\ + \ d {1,3} ()?)? (\ d {3} []?) (\ d {2} []?) {2} \ d {2} $
@ מבחן ציבורי בטל כאשר MatchesPhoneNumber_thenCorrect () {דפוסי מחרוזת = "^ (\ + \ d {1,3} ()?)? ((\ (\ d {3} \)) | \ d { 3}) [-.]? \ d {3} [-.]? \ d {4} $ "+" | ^ (\ + \ d {1,3} ()?)? (\ \ d {3} []?) {2} \ d {3} $ "+" | ^ (\ + \ d {1,3} ()?)? (\ d {3} [] ?) (\ d {2} []?) {2} \ d {2} $ "; מחרוזת [] validPhoneNumbers = {"2055550125", "202 555 0125", "(202) 555-0125", "+111 (202) 555-0125", "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"}; תבנית תבנית = תבנית. קומפילציה (תבניות); עבור (String phoneNumber: validPhoneNumbers) {Matcher matcher = pattern.matcher (phoneNumber); assertTrue (matcher.matches ()); }}

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

4. מסקנה

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

כמו תמיד, קוד המקור המלא של המאמר זמין באתר GitHub.