Basically, you need to take 3 or 4 different patterns and combine them with "|":
String pattern = "\\d{10}|(?:\\d{3}-){2}\\d{4}|\\(\\d{3}\\)\\d{3}-?\\d{4}";
\d{10}matches 1234567890(?:\d{3}-){2}\d{4}matches 123-456-7890\(\d{3}\)\d{3}-?\d{4}matches (123)456-7890 or (123)4567890
Considering these facts about phone number format:-
- 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.
String allCountryRegex = "^(\\+\\d{1,3}( )?)?((\\(\\d{1,3}\\))|\\d{1,3})[- .]?\\d{3,4}[- .]?\\d{4}$";
Let's break the regex and understand,
^start of expression(\\+\\d{1,3}( )?)?is optional match of country code between 1 to 3 digits prefixed with '+' symbol, followed by space or no space.((\\(\\d{1,3}\\))|\\d{1,3}is mandatory group of 1 to 3 digits with or without parenthesis followed by hyphen, space or no space.\\d{3,4}[- .]?is mandatory group of 3 or 4 digits followed by hyphen, space or no space\\d{4}is mandatory group of last 4 digits$end of expression
This regex pattern matches most of the countries phone number format including these:-
String Afghanistan = "+93 30 539-0605";
String Australia = "+61 2 1255-3456";
String China = "+86 (20) 1255-3456";
String Germany = "+49 351 125-3456";
String India = "+91 9876543210";
String Indonesia = "+62 21 6539-0605";
String Iran = "+98 (515) 539-0605";
String Italy = "+39 06 5398-0605";
String NewZealand = "+64 3 539-0605";
String Philippines = "+63 35 539-0605";
String Singapore = "+65 6396 0605";
String Thailand = "+66 2 123 4567";
String UK = "+44 141 222-3344";
String USA = "+1 (212) 555-3456";
String Vietnam = "+84 35 539-0605";
Source:https://codingnconcepts.com/java/java-regex-for-phone-number/
The exact regex you seem to be going for (based on what you've tried so far) is:
^(?:0091|\\+91|0)[7-9][0-9]{9}$
- Begins with 0, +91 or 0091
- Followed by a 7-9
- Followed by exactly 9 numbers
- No capture groups
- Must match entire input
Working example on RegExr
As a general tip, to have worked this out yourself I'd advise using a site like RegExr or RegexPal
Set it to multi-line mode (so that ^ and $ match at the end of each line) then add 0091, +91 and 0 into the input box on separate lines - so you have something like this.
Then try to make a regex that matches just that part, in your case you needed something like
^0091|\+91|0$
Note: on RegExr you don't have to escape backslashes (so when you use the regex in java you need to go through escaping them).
Guess this regex would work:
^((0091)|(\+91)|(0))([7-9]{1})([0-9]{9})$
^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$
Matches the following
123-456-7890
(123) 456-7890
123 456 7890
123.456.7890
+91 (123) 456-7890
If you do not want a match on non-US numbers use
^(\+0?1\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$
Update :
As noticed by user Simon Weaver below, if you are also interested in matching on unformatted numbers just make the separator character class optional as [\s.-]?
^(\+\d{1,2}\s?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$
https://regex101.com/r/j48BZs/2
There are many variations possible for this problem. Here is a regular expression similar to an answer I previously placed on SO.
^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$
It would match the following examples and much more:
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
800 555 1234x5678
8005551234 x5678
1 800 555-1234
1----800----555-1234
Regardless of the way the phone number is entered, the capture groups can be used to breakdown the phone number so you can process it in your code.
- Group1: Country Code (ex: 1 or 86)
- Group2: Area Code (ex: 800)
- Group3: Exchange (ex: 555)
- Group4: Subscriber Number (ex: 1234)
- Group5: Extension (ex: 5678)
Here is a breakdown of the expression if you're interested:
^\s* #Line start, match any whitespaces at the beginning if any.
(?:\+?(\d{1,3}))? #GROUP 1: The country code. Optional.
[-. (]* #Allow certain non numeric characters that may appear between the Country Code and the Area Code.
(\d{3}) #GROUP 2: The Area Code. Required.
[-. )]* #Allow certain non numeric characters that may appear between the Area Code and the Exchange number.
(\d{3}) #GROUP 3: The Exchange number. Required.
[-. ]* #Allow certain non numeric characters that may appear between the Exchange number and the Subscriber number.
(\d{4}) #Group 4: The Subscriber Number. Required.
(?: *x(\d+))? #Group 5: The Extension number. Optional.
\s*$ #Match any ending whitespaces if any and the end of string.
To make the Area Code optional, just add a question mark after the (\d{3}) for the area code.