14/06/2023
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.

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 enMatcherfor 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.

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_LINE | FIXED_LINE_OR_MOBILE | MOBILE | PAGER |
| PERSONAL_NUMBER | PREMIUM_RATE | SHARED_COST | TOLL_FREE |
| UAN | UNKNOWN | VOICEMAIL | VOIP |
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.

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
| Karakteristik | Regulære Udtryk | Google libphonenumber API |
|---|---|---|
| Kompleksitet | Hø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. |
| Vedligeholdelse | Svær. Ændringer i formater kræver opdatering af regex-mønstre. | Nemmere. Biblioteket opdateres af Google for at afspejle ændringer i telefonstandarder. |
| International Support | Begrænset til de formater, der er eksplicit defineret i regex. | Fremragende. Understøtter et bredt udvalg af internationale formater. |
| Funktionalitet | Primært mønstermatchning. | Parsing, formatering, validering, typeidentifikation. |
| Ydeevne | Kan 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.
