Bekræft telefonnumre med Java Regex

1. Oversigt

Nogle gange er vi nødt til at validere tekst for at sikre, at dens indhold overholder noget format. I denne hurtige vejledning ser vi, hvordan man validerer forskellige formater af telefonnumre ved hjælp af regulære udtryk.

2. Regelmæssige udtryk til validering af telefonnumre

2.1. Ti-cifret nummer

Lad os starte med et simpelt udtryk, der vil Kontroller, om tallet har ti cifre og intet andet:

@Test offentlig ugyldig nårMatchesTenDigitsNumber_thenCorrect () {Mønster mønster = Mønster.kompil ("^ \ d {10} $"); Matcher matcher = pattern.matcher ("2055550125"); assertTrue (matcher.matches ()); }

Dette udtryk tillader tal som 2055550125.

2.2. Antal med hvide mellemrum, prikker eller bindestreger

Lad os i det andet eksempel se, hvordan vi kan tillad valgfri mellemrum, prikker eller bindestreger (-) mellem tallene:

@Test offentlig ugyldig nårMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect () {Mønster mønster = Mønster.kompil ("^ (\ d {3} [-.]?) {2} \ d {4} $"); Matcher matcher = mønster.matcher ("202555 0125"); assertTrue (matcher.matches ()); }

For at nå dette ekstra mål (valgfrit mellemrum eller bindestreg) har vi simpelthen tilføjet tegnene:

  • [- .]?

Dette mønster tillader tal som 2055550125, 202 555 0125, 202.555.0125og 202-555-0125.

2.3. Antal med parenteser

Lad os derefter tilføje muligheden for at få første del af vores telefon mellem parenteser:

@Test offentlig ugyldig nårMatchesTenDigitsNumberParenthesis_thenCorrect () {Mønster mønster = Mønster.kompil "" ((\ (\ d {3} \)) | \ d {3}) [-.]? \ d {3} [-.]? \ d {4} $ "); Matcher matcher = mønster.matcher ("(202) 555-0125"); assertTrue (matcher.matches ()); }

For at tillade den valgfri parentes i nummeret har vi føjet følgende tegn til vores regulære udtryk:

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

Dette udtryk tillader tal som (202)5550125, (202) 555-0125 eller (202)-555-0125. Derudover tillader dette udtryk også de telefonnumre, der er dækket af det foregående eksempel.

2.4. Nummer med internationalt præfiks

Lad os endelig se, hvordan man gør det tillad et internationalt præfiks i starten af ​​et telefonnummer:

@Test offentlig ugyldigt nårMatchesTenDigitsNumberPrefix_thenCorrect () {Mønster mønster = Mønster.kompil ("^ (\ + \ d {1,3} ()?)? ((\ (\ d {3} \)) | \ d {3}) [-.]? \ d {3} [-.]? \ d {4} $ "); Matcher matcher = mønster.matcher ("+ 111 (202) 555-0125"); assertTrue (matcher.matches ()); } 

For at tillade præfikset i vores nummer har vi tilføjet tegnene i begyndelsen af ​​vores mønster:

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

Dette udtryk gør det muligt for telefonnumre at inkludere internationale præfikser under hensyntagen til at internationale præfikser normalt er numre med maksimalt tre cifre.

3. Anvendelse af flere regulære udtryk

Som vi har set, kan et gyldigt telefonnummer have flere forskellige formater. Derfor vil vi måske kontrollere, om vores Snor overholder et af disse formater.

I det sidste afsnit startede vi med et simpelt udtryk og tilføjede mere kompleksitet for at nå målet om at dække mere end et format. Men nogle gange er det ikke muligt at bruge kun et udtryk. I dette afsnit vil vi se hvordan man sammenføjer flere regulære udtryk til en enkelt.

Hvis vi ikke er i stand til at oprette et almindeligt regulært udtryk, der kan validere alle de mulige tilfælde, som vi vil dække, kan vi definere forskellige udtryk for hver af tilfældene og derefter bruge dem alle sammen ved at sammenkæde dem med et rørsymbol (|).

Lad os se et eksempel, hvor vi bruger følgende udtryk:

  • Udtrykket, der blev brugt i sidste afsnit:
    • ^ (\ + \ d {1,3} ()?)? ((\ (\ d {3} \)) | \ d {3}) [-.]? \ d { 3} [-.]? \ d {4} $
  • Regelmæssigt udtryk for at tillade tal som +111 123 456 789:
    • ^ (\ + \ d {1,3} ()?)? (\ d {3} []?) {2} \ d {3} $
  • Mønster, der tillader tal som +111 123 45 67 89:
    • ^ (\ + \ d {1,3} ()?)? (\ d {3} []?) (\ d {2} []?) {2} \ d {2} $
@Test offentligt ugyldigt nårMatchesPhoneNumber_thenCorrect () {Strengmønstre = "^ (\ + \ 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} $ "; Streng [] validPhoneNumbers = {"2055550125", "202555 0125", "(202) 555-0125", "+111 (202) 555-0125", "636 856 789", "+111636856789", "636 85 67 89", "+111636 85 67 89"}; Mønster mønster = Mønster. Samling (mønstre); for (String phoneNumber: validPhoneNumbers) {Matcher matcher = pattern.matcher (phoneNumber); assertTrue (matcher.matches ()); }}

Som vi kan se i ovenstående eksempel, ved at bruge rørsymbolet, kan vi bruge de tre udtryk på én gang, hvilket giver os mulighed for at dække flere tilfælde end med kun et regulært udtryk.

4. Konklusion

I denne artikel har vi set, hvordan vi kan kontrollere, om en Snor indeholder et gyldigt telefonnummer ved hjælp af forskellige regulære udtryk. Vi har også lært, hvordan man bruger flere regulære udtryk på samme tid.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.