How to verify mobile numbers using libphonenumber in Java?

Valider mobilnumre i Java

14/06/2023

Rating: 4.66 (3205 votes)

Validering af mobilnumre i Java: En omfattende guide

Verifikation af mobilnumre er en kritisk opgave i softwareudvikling, især når man håndterer brugerdata på tværs af forskellige lande. Hvert land har sine egne unikke formater for mobilnumre, hvilket gør en universel valideringsmetode udfordrende. I denne artikel vil vi dykke ned i, hvordan man effektivt kan validere mobilnumre i Java ved hjælp af to primære metoder: regulære udtryk (regex) og Googles anerkendte libphonenumber API. Vi vil fokusere på formater for både Indien og USA, men principperne kan udvides til andre regioner med passende tilpasninger.

Which digit is a valid mobile number?
The first digit should contain numbers between 6 to 9. The rest 9 digit can contain any number between 0 to 9. The mobile number can have 11 digits also by including 0 at the starting. The number which satisfies the above criteria is a valid mobile Number. Examples: 7873923408 5678729234 Prerequisites: Java Regular Expressions Output:
Indholdsfortegnelse

Udfordringer ved Mobilnummerformater

Mobilnumre varierer betydeligt globalt. Overvej blot de forskellige måder, et amerikansk telefonnummer kan repræsenteres på:

1234567890
123-456-7890
123-456-7890 x1234
(123)-456-7890
123.456.7890
123 456 7890

Indiske mobilnumre præsenterer også en række formater:

9123124123
09123124123
+919123124123
+91-9123124123
+91 9222222222
+7666 999 999

Disse variationer understreger behovet for robuste valideringsmekanismer.

Metode 1: Brug af Regulære Udtryk (Regex)

Regulære udtryk er kraftfulde værktøjer til mønstermatchning i strenge. I Java kan vi anvende dem til at definere og verificere mobilnummerformater.

Pattern og Matcher Klasserne

Java's java.util.regex-pakke giver os klasserne Pattern og Matcher. Pattern kompilerer et regulært udtryk til et mønsterobjekt, mens Matcher bruger dette mønster til at udføre matchende operationer på en input-sekvens.

Nøglemetoder:

  • Pattern.compile(String regex): Kompilerer det regulære udtryk.
  • pattern.matcher(CharSequence input): Opretter en Matcher for inputstrengen.
  • matcher.find(): Forsøger at finde den næste delsekvens af input, der matcher mønsteret.
  • matcher.group(): Returnerer den matchede delsekvens.

Eksempel: Grundlæggende Validering med Pattern og Matcher

Dette eksempel viser, hvordan man validerer et simpelt indisk mobilnummerformat (starter med 7, 8 eller 9, efterfulgt af 9 cifre).

import java.util.regex.*; public class MobileNumberValidation { // Funktion til at kontrollere, om mobilnummeret er gyldigt public static boolean isValidMobileNo(String str) { // Mønster: Starter med (0 eller 91) valgfrit, derefter 7-9, efterfulgt af 9 cifre. Pattern ptrn = Pattern.compile("(0|91)?[7-9][0-9]{9}"); Matcher match = ptrn.matcher(str); // Returnerer sandt, hvis hele strengen matcher mønsteret. return (match.find() && match.group().equals(str)); } // Driver kode public static void main(String args[]) { String str = "9800088899"; // Mobilnummer der skal tjekkes // Kald af funktionen if (isValidMobileNo(str)) { System.out.println("Dette er et gyldigt mobilnummer."); } else { System.out.println("Indtastede mobilnummer er ugyldigt."); } } } 

Eksempel: Validering af Forskellige US Formater med String.matches()

String.matches(String regex) metoden er en genvej til at matche hele strengen mod et regulært udtryk. Her er et eksempel, der dækker flere US-formater:

public class MobileNumberValidation1 { public static void main(String args[]) { // Kald af metoden og validering af forskellige formater System.out.println("1234567890: " + validateNumber("1234567890")); System.out.println("1234 567 890: " + validateNumber("1234 567 890")); System.out.println("123 456 7890: " + validateNumber("123 456 7890")); System.out.println("123-567-8905: " + validateNumber("123-567-8905")); System.out.println("9866-767-545: " + validateNumber("9866-767-545")); System.out.println("9866.767.545: " + validateNumber("9866.767.545")); System.out.println("9866-767.545: " + validateNumber("9866-767.545")); System.out.println("123-456-7890 ext4444: " + validateNumber("123-456-7890 ext4444")); System.out.println("123-456-7890 x4444: " + validateNumber("123-456-7890 x4444")); System.out.println("(123)-456-7890: " + validateNumber("(123)-456-7890")); } // Funktion validerer mobilnumre private static boolean validateNumber(String mobNumber) { // Validerer telefonnumre med 10 cifre (9998887776) if (mobNumber.matches("\\d{10}")) return true; // Validerer telefonnumre med cifre, -, . eller mellemrum else if (mobNumber.matches("\\d{3}[-\\.\\s]\\d{3}[-\\.\\s]\\d{4}")) return true; // Validerer telefonnumre med 4 cifre, separator, 3 cifre, separator, 3 cifre else if (mobNumber.matches("\\d{4}[-\\.\\s]\\d{3}[-\\.\\s]\\d{3}")) return true; // Validerer telefonnumre med cifre og udvidelse (længde 3 til 5) else if (mobNumber.matches("\\d{3}-\\d{3}-\\d{4}\\s(x|(ext))\\d{3,5}")) return true; // Validerer telefonnumre med cifre og områdekode i parentes else if (mobNumber.matches("\\(\\d{3}\\)-\\d{3}-\\d{4}")) return true; // Validerer telefonnumre med 5-cifret områdekode i parentes else if (mobNumber.matches("\\(\\d{5}\\)-\\d{3}-\\d{3}")) return true; // Validerer telefonnumre med 4-cifret områdekode i parentes else if (mobNumber.matches("\\(\\d{4}\\)-\\d{3}-\\d{3}")) return true; // Returnerer falsk, hvis ingen af inputMatcherne findes else return false; } } 

Selvom regex er kraftfuldt, kan det blive komplekst at vedligeholde og teste alle tænkelige formater. Dette fører os til en mere robust løsning.

How many digits can a mobile number have?
The first digit should contain numbers between 7 and 9. The rest 9 digits can contain any number between 0 and 9. The mobile number can have 11 digits also by including 0 at the starting. The mobile number can be of 12 digits also by including 91 at the starting. Example: import java.util.regex.*; } else { Notes:

Metode 2: Brug af Google libphonenumber API

Googles libphonenumber bibliotek er en open-source løsning, der tilbyder omfattende funktionalitet til håndtering af internationale telefonnumre. Det bruges også i Android-frameworket.

Fordele ved libphonenumber:

  • International Support: Håndterer formater fra næsten alle lande.
  • Parsing & Formatting: Kan fortolke og formatere numre korrekt.
  • Validering: Verificerer gyldigheden af numre baseret på landespecifikke regler.
  • Nummertyper: Kan identificere forskellige typer numre (mobil, fastnet, betalingsnummer osv.).

Understøttede Nummertyper:

FIXED_LINEFIXED_LINE_OR_MOBILEMOBILEPAGER
PERSONAL_NUMBERPREMIUM_RATESHARED_COSTTOLL_FREE
UANUNKNOWNVOICEMAILVOIP

Bemærk: Før du bruger biblioteket, skal du tilføje libphonenumber JAR-filen til dit projekt.

Eksempel: Validering med libphonenumber

Dette eksempel viser, hvordan man bruger PhoneNumberUtil til at validere både amerikanske og indiske numre.

import com.google.i18n.phonenumbers.NumberParseException; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; public class MobileNumberValidation2 { public static void main(String args[]) throws NumberParseException { System.out.println("US Nummer Formater: "); String[] usFormats = { "(541) 777-3777", "+1-541-999-3111", "1-541-788-5010", "001-541-876-9090", // Bemærk: Dette format kan kræve specifik håndtering "181 541 745 9090" // Bemærk: Dette format kan kræve specifik håndtering }; validateNumber(usFormats, "US"); System.out.println("\nIndiske Nummer Formater: "); String[] indiaNumberFormats = { "+91 9999999999", "8888888888", "+91-3333333333", "+91 9222222222", "+91 8888 999 777", "+7666 999 999" // Bemærk: Dette er sandsynligvis et forkert eksempel for Indien }; validateNumber(indiaNumberFormats, "IN"); } // Funktion der validerer mobilnumre private static void validateNumber(String[] phoneNumbers, String country) throws NumberParseException { // PhoneNumberUtil klassen leverer formatering, parsing og validering // getInstance() metoden er indlæst med al telefonnummer metadata PhoneNumberUtil numberUtil = PhoneNumberUtil.getInstance(); // for-each loop itererer over nummerformateringsarrayet for (String number: phoneNumbers) { // parse() metoden parser en streng og landekode og returnerer det som et telefonnummer i proto buffer format PhoneNumber phoneNumber = numberUtil.parse(number, country); // Tester om et telefonnummer matcher et gyldigt mønster eller ej boolean isValid = numberUtil.isValidNumber(phoneNumber); if (isValid) { // Udskriver hvis et nummer er et gyldigt nummer System.out.println(number + " er et gyldigt mobilnummer."); } else { // Udskriver hvis nummeret er ugyldigt System.out.println(number + " er et ikke gyldigt mobilnummer. "); } } } } 

Hvornår er et mobilnummer gyldigt?

Generelt set er et mobilnummer gyldigt, hvis det overholder de specifikke formateringsregler for et givent land eller region. Dette inkluderer typisk antallet af cifre, brug af landekoder, og om bestemte præfikser er tilladt.

Antal cifre i et mobilnummer

Antallet af cifre varierer fra land til land. I Indien kan et mobilnummer typisk have 10 cifre, men kan også være 11 cifre (med et foranstillet 0) eller 12 cifre (med et foranstillet +91). US-numre har ofte 10 cifre (uden landekode) eller 11 cifre (med landekoden '1'). libphonenumber API'en kan håndtere disse variationer korrekt.

How to validate mobile number in Java?
There are two ways to validate mobile number in Java: The Pattern class belongs to java.util.regex package. It provides the compile () method that compiles the given regular expression into a pattern. It accepts a string of regular expressions to be compiled. Syntax:

Hvilket ciffer er et gyldigt startciffer?

For indiske mobilnumre er det almindeligt, at de starter med cifrene 6, 7, 8 eller 9. I andre lande kan disse regler være anderledes. libphonenumber tager højde for disse landespecifikke regler.

Sammenligning: Regex vs. libphonenumber

KarakteristikRegulære UdtrykGoogle libphonenumber API
KompleksitetHøj til meget høj for at dække alle formater. Kræver dybdegående viden om regex.Moderat. Kræver integration af et bibliotek, men forenkler valideringen betydeligt.
VedligeholdelseSvær. Ændringer i formater kræver opdatering af regex-mønstre.Nemmere. Biblioteket opdateres af Google for at afspejle ændringer i telefonstandarder.
International SupportBegrænset til de formater, der er eksplicit defineret i regex.Fremragende. Understøtter et bredt udvalg af internationale formater.
FunktionalitetPrimært mønstermatchning.Parsing, formatering, validering, typeidentifikation.
YdeevneKan være hurtig for simple mønstre, men kan blive langsom for komplekse.Generelt optimeret, men kan have en lille overhead ved initialisering.

Ofte Stillede Spørgsmål (FAQ)

Hvordan validerer jeg et tomt mobilnummerfelt i Java?

Hvis et mobilnummerfelt ikke er obligatorisk, skal du først kontrollere, om strengen er tom eller null. Hvis den ikke er tom, kan du derefter anvende din valideringslogik (enten regex eller libphonenumber). For eksempel, hvis du bruger Bean Validation, kan du kombinere @Size(min=0, max=10) med en brugerdefineret validator eller en betinget validering, der kun tjekker længden, hvis feltet ikke er tomt.

Kan jeg validere mobilnumre uden et eksternt bibliotek?

Ja, du kan bruge regulære udtryk. Dog, som tidligere nævnt, bliver det hurtigt uoverskueligt at vedligeholde korrekte mønstre for alle globale formater. libphonenumber API'en anbefales for en robust og vedligeholdelsesvenlig løsning.

Konklusion

Validering af mobilnumre i Java kan opnås effektivt gennem enten regulære udtryk eller Googles libphonenumber API. Mens regulære udtryk giver en indbygget løsning, tilbyder libphonenumber en mere omfattende, nøjagtig og internationalt-orienteret tilgang, der gør den til det foretrukne valg for de fleste moderne applikationer. Ved at udnytte disse metoder kan du sikre dataintegritet og forbedre brugeroplevelsen markant.

GitHub Kodeeksempler:

  • Google libphonenumber Repository

Hvis du vil læse andre artikler, der ligner Valider mobilnumre i Java, kan du besøge kategorien Teknologi.

Go up