- Java Regex to Validate Phone Number
- Regex to match 10 digit Phone Number with No space
- Regex to match 10 digit Phone Number with WhiteSpaces, Hyphens or No space
- Regex to match 10 digit Phone Number with Parentheses
- Regex to match 10 digit Phone number with Country Code Prefix
- Regex to match Phone Number of All Country Formats
- Regex to match Phone Number of Specific Country Format
- See Also
- Проверка телефонных номеров с помощью Java Regex
- 2. Регулярные выражения для проверки телефонных номеров
- 2.1. Десятизначное число
- 2.2. Число с пробелами, точками или дефисами
- 2.3. Число в скобках
- 2.4. Номер с международным префиксом
- 3. Применение нескольких регулярных выражений
- 4. Вывод
Java Regex to Validate Phone Number
A typical mobile phone number has following component:
Where depending on the country,
- country_code is somewhere between 1 to 3 digits
- area_code and subscriber_number combined is somewhere between 8 to 11 digits
If you simply require a regex to match all country format then here it is,
If you want to know how we came up with this regex? then please read this full article.
Regex to match 10 digit Phone Number with No space
This is simplest regex to match just 10 digits. We will also see here how to use regex to validate pattern:
String regex = "^\\d$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher("9876543210"); matcher.matches(); // returns true if pattern matches, else returns false
Let’s break the regex and understand,
- ^ start of expression
- d is mandatory match of 10 digits without any space
- $ end of expression
You can make regex more flexible to match between 8 to 11 digits phone number with no space, using this regex:
Regex to match 10 digit Phone Number with WhiteSpaces, Hyphens or No space
String spacesAndHyphenRegex = "^(\\d[- ]?)\\d$";
Let’s break the regex and understand,
- ^ start of expression
- d is mandatory match of 3 digits
- [- ]? is optional match of whitespace or hyphen after 3 digits
- is to repeat the above match d[- ]? two times becomes total 6 digits
- d is mandatory match of last 4 digits
- $ end of expression
This Pattern will match mobile phone numbers like 9876543210, 987 654 3210, 987-654-3210, 987 654-3210, 987 6543210, etc.
Regex to match 10 digit Phone Number with Parentheses
String parenthesesRegex = "^((\\(\\d\\))|\\d)[- ]?\\d[- ]?\\d$";
Let’s break the regex and understand,
- ^ start of expression
- (\\(\\d\\))|\\d) is mandatory match of 3 digits with or without parentheses
- [- ]? is optional match of whitespace or hyphen after after 3 digits
- \\d[- ]? is mandatory match of next 3 digits followed by whitespace, hyphen or no space
- \\d is mandatory match of last 4 digits
- $ end of expression
This Pattern will match mobile phone numbers with spaces and hyphen, as well as numbers like (987)6543210, (987) 654-3210, (987)-654-3210 etc.
Regex to match 10 digit Phone number with Country Code Prefix
This regex is combined with regex to include parenthesis
String countryCodeRegex = "^(\\+\\d( )?)?((\\(\\d\\))|\\d)[- .]?\\d[- .]?\\d$";
Let’s break the regex and understand,
- ^ start of expression
- (\\+\\d( )?)? is optional match of country code between 1 to 3 digits prefixed with + symbol, followed by space or no space.
- ((\\(\\d\\))|\\d)[- .]?\\d[- .]?\\d is mandatory match of 10 digits with or without parenthesis, followed by whitespace, hyphen or no space
- $ end of expression
This Pattern will match mobile phone numbers from previous examples as well as numbers like +91 (987)6543210, +111 (987) 654-3210, +66 (987)-654-3210 etc.
Regex to match Phone Number of All Country Formats
Before we start defining a regex, let’s look at some of the country phone number formats:-
Abkhazia +995 442 123456 Afghanistan +93 30 539-0605 Australia +61 2 1255-3456 China +86 (20) 1255-3456 Germany +49 351 125-3456 Indonesia +62 21 6539-0605 Iran +98 (515) 539-0605 Italy +39 06 5398-0605 New Zealand +64 3 539-0605 Philippines +63 35 539-0605 Singapore +65 6396 0605 Thailand +66 2 123 4567 UK +44 141 222-3344 USA +1 (212) 555-3456 Vietnam +84 35 539-0605
Let’s extract some information from these numbers:-
- Country Code prefix starts with ‘+’ and has 1 to 3 digits
- Last part of the number, also known as subscriber number is 4 digits in all of the numbers
- Most of the countries have 10 digits phone number after excluding country code. A general observation is that all countries phone number falls somewhere between 8 to 11 digits after excluding country code.
Let’s see again on regex from previous example to validate country code:
String countryCodeRegex = "^(\\+\\d( )?)?((\\(\\d\\))|\\d)[- .]?\\d[- .]?\\d$"l
The above regex is to match 10 digit phone numbers, Let’s make some changes in this and make it more flexible to match 8 to 11 digits phone numbers:-
Regex to Match All Country Formats
String allCountryRegex = "^(\\+\\d( )?)?((\\(\\d\\))|\\d)[- .]?\\d[- .]?\\d$";
Let’s break the regex and understand,
- ^ start of expression
- (\\+\\d( )?)? is optional match of country code between 1 to 3 digits prefixed with ‘+’ symbol, followed by space or no space.
- ((\\(\\d\\))|\\d is mandatory group of 1 to 3 digits with or without parenthesis followed by hyphen, space or no space.
- \\d[- .]? is mandatory group of 3 or 4 digits followed by hyphen, space or no space
- \\d is mandatory group of last 4 digits
- $ end of expression
Regex to match Phone Number of Specific Country Format
As you saw in the previous example that we have to add some flexibility in our regex to match all countries’ formats. If you want more strict validation of specific country format then here are examples of India and Singapore Phone number regex pattern:
String indiaRegex = "^(\\+\\d( )?)?((\\(\\d\\))|\\d)[- .]?\\d[- .]?\\d$"; String singaporeRegex = "^(\\+\\d( )?)?\\d[- .]?\\d$";
See Also
Ashish Lahoti is a Software Engineer with 12+ years of experience in designing and developing distributed and scalable enterprise applications using modern practices. He is a technology enthusiast and has a passion for coding & blogging.
Проверка телефонных номеров с помощью Java Regex
Иногда нам нужно проверить текст, чтобы убедиться, что его содержимое соответствует какому-то формату. В этом кратком руководстве мы увидим, как проверять различные форматы телефонных номеров с помощью регулярных выражений .
2. Регулярные выражения для проверки телефонных номеров
2.1. Десятизначное число
Давайте начнем с простого выражения, которое будет проверять, состоит ли число из десяти цифр и больше ничего :
@Test public void whenMatchesTenDigitsNumber_thenCorrect() Pattern pattern = Pattern.compile("^\\d$"); Matcher matcher = pattern.matcher("2055550125"); assertTrue(matcher.matches()); >
Это выражение позволит использовать такие числа, как 2055550125 .
2.2. Число с пробелами, точками или дефисами
Во втором примере давайте посмотрим, как мы можем разрешить необязательные пробелы, точки или дефисы (-) между числами:
@Test public void whenMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect() Pattern pattern = Pattern.compile("^(\\d[- .]?)\\d$"); Matcher matcher = pattern.matcher("202 555 0125"); assertTrue(matcher.matches()); >
Для достижения этой дополнительной цели (необязательный пробел или дефис) мы просто добавили символы:
Этот шаблон позволит использовать такие номера, как 2055550125 , 202 555 0125 , 202.555.0125 и 202-555-0125 .
2.3. Число в скобках
Далее добавим возможность разместить первую часть нашего телефона в скобках :
@Test public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() Pattern pattern = Pattern.compile"^((\\(\\d\\))|\\d)[- .]?\\d[- .]?\\d$"); Matcher matcher = pattern.matcher("(202) 555-0125"); assertTrue(matcher.matches()); >
Чтобы разрешить необязательные круглые скобки в числе, мы добавили в наше регулярное выражение следующие символы:
Это выражение позволит использовать такие числа, как (202)5550125 , (202) 555-0125 или (202)-555-0125 . Кроме того, это выражение также позволит использовать телефонные номера, описанные в предыдущем примере.
2.4. Номер с международным префиксом
Наконец, давайте посмотрим, как разрешить международный префикс в начале номера телефона :
@Test public void whenMatchesTenDigitsNumberPrefix_thenCorrect() Pattern pattern = Pattern.compile("^(\\+\\d( )?)?((\\(\\d\\))|\\d)[- .]?\\d[- .]?\\d$"); Matcher matcher = pattern.matcher("+111 (202) 555-0125"); assertTrue(matcher.matches()); >
Чтобы разрешить префикс в нашем номере, мы добавили в начало нашего шаблона символы:
Это выражение позволит телефонным номерам включать международные префиксы, принимая во внимание, что международные префиксы обычно представляют собой номера, состоящие не более чем из трех цифр.
3. Применение нескольких регулярных выражений
Как мы видели, действительный номер телефона может иметь несколько различных форматов. Поэтому мы можем захотеть проверить, соответствует ли наша строка любому из этих форматов.
В последнем разделе мы начали с простого выражения и усложнили его, чтобы достичь цели охвата более одного формата. Однако иногда невозможно использовать только одно выражение. В этом разделе мы увидим, как объединить несколько регулярных выражений в одно .
Если мы не можем создать общее регулярное выражение, которое может проверять все возможные случаи, которые мы хотим охватить, мы можем определить разные выражения для каждого из случаев, а затем использовать их все вместе, объединив их с помощью символа вертикальной черты (|).
Давайте посмотрим на пример, где мы используем следующие выражения:
- Выражение, использованное в последнем разделе:
- ^( \ + \ d( )?)?(( \ ( \ d \ ))| \ d) [- .] ? \ d < 3>[- .] ? \ d$
- Регулярное выражение, разрешающее такие номера, как +111 123 456 789:
- ^( \ + \ d( )?)?( \ d [ ] ?) \ d$
- Шаблон, позволяющий использовать такие номера, как +111 123 45 67 89:
- ^( \ + \ d( )?)?( \ d [ ] ?)( \ d [ ] ?) \ d$
@Test public void whenMatchesPhoneNumber_thenCorrect() String patterns = "^(\\+\\d( )?)?((\\(\\d\\))|\\d)[- .]?\\d[- .]?\\d$" + "|^(\\+\\d( )?)?(\\d[ ]?)\\d$" + "|^(\\+\\d( )?)?(\\d[ ]?)(\\d[ ]?)\\d$"; String[] 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">; Pattern pattern = Pattern.compile(patterns); for(String phoneNumber : validPhoneNumbers) Matcher matcher = pattern.matcher(phoneNumber); assertTrue(matcher.matches()); > >
Как мы можем видеть в приведенном выше примере, используя символ вертикальной черты, мы можем использовать три выражения за один раз, что позволяет нам охватить больше случаев, чем с одним регулярным выражением.
4. Вывод
В этой статье мы увидели, как проверить, содержит ли строка действительный номер телефона, используя различные регулярные выражения. Мы также научились использовать несколько регулярных выражений одновременно.
Как всегда, полный исходный код статьи доступен на GitHub .