Regular expression to match standard 10 digit phone number

I want to write a regular expression for a standard US type phone number that supports the following formats:

###-###-#### (###) ###-#### ### ### #### ###.###.#### 

where # means any number. So far I came up with the following expressions

^[1-9]\d{2}-\d{3}-\d{4} ^\(\d{3}\)\s\d{3}-\d{4} ^[1-9]\d{2}\s\d{3}\s\d{4} ^[1-9]\d{2}\.\d{3}\.\d{4} 

respectively. I am not quite sure if the last one is correct for the dotted check. I also want to know if there is any way I could write a single expression instead of the 4 different ones that cater to the different formats I mentioned. If so, I am not sure how do I do that. And also how do I modify the expression/expressions so that I can also include a condition to support the area code as optional component. Something like

+1 ### ### #### 

where +1 is the area code and it is optional.

5

22 Answers

^(\+\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}$ 
15

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.

12

^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

Matches these phone numbers:

1-718-444-1122 718-444-1122 (718)-444-1122 17184441122 7184441122 718.444.1122 1718.444.1122 1-123-456-7890 1 123-456-7890 1 (123) 456-7890 1 123 456 7890 1.123.456.7890 +91 (123) 456-7890 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 18001234567 1 800 123 4567 1-800-123-4567 +18001234567 +1 800 123 4567 +1 (800) 123 4567 1(800)1234567 +1800 1234567 1.8001234567 1.800.123.4567 +1 (800) 123-4567 18001234567 1 800 123 4567 +1 800 123-4567 +86 800 123 4567 1-800-123-4567 1 (800) 123-4567 (800)123-4567 (800) 123-4567 (800)1234567 800-123-4567 800.123.4567 1231231231 123-1231231 123123-1231 123-123 1231 123 123-1231 123-123-1231 (123)123-1231 (123)123 1231 (123) 123-1231 (123) 123 1231 +99 1234567890 +991234567890 (555) 444-6789 555-444-6789 555.444.6789 555 444 6789 18005551234 1 800 555 1234 +1 800 555-1234 +86 800 555 1234 1-800-555-1234 1.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 (003) 555-1212 (103) 555-1212 (911) 555-1212 18005551234 1 800 555 1234 +86 800-555-1234 1 (800) 555-1234 

See regex101.com

1

Regex pattern to validate a regular 10 digit phone number plus optional international code (1 to 3 digits) and optional extension number (any number of digits):

/(\+\d{1,3}\s?)?((\(\d{3}\)\s?)|(\d{3})(\s|-?))(\d{3}(\s|-?))(\d{4})(\s?(([E|e]xt[:|.|]?)|x|X)(\s?\d+))?/g 

Demo:

Valid entries:

/* Full number */ +999 (999) 999-9999 Ext. 99999 /* Regular local phone number (XXX) XXX-XXXX */ 1231231231 123-1231231 123123-1231 123-123 1231 123 123-1231 123-123-1231 (123)123-1231 (123)123 1231 (123) 123-1231 (123) 123 1231 /* International codes +XXX (XXX) XXX-XXXX */ +99 1234567890 +991234567890 /* Extensions (XXX) XXX-XXXX Ext. XXX... */ 1234567890 Ext 1123123 1234567890Ext 1123123 1234567890 Ext1123123 1234567890Ext1123123 1234567890 Ext: 1123123 1234567890Ext: 1123123 1234567890 Ext:1123123 1234567890Ext:1123123 1234567890 Ext. 1123123 1234567890Ext. 1123123 1234567890 Ext.1123123 1234567890Ext.1123123 1234567890 ext 1123123 1234567890ext 1123123 1234567890 ext1123123 1234567890ext1123123 1234567890 ext: 1123123 1234567890ext: 1123123 1234567890 ext:1123123 1234567890ext:1123123 1234567890 X 1123123 1234567890X1123123 1234567890X 1123123 1234567890 X1123123 1234567890 x 1123123 1234567890x1123123 1234567890 x1123123 1234567890x 1123123 

Here's a fairly compact one I created.

Search: \+?1?\s*\(?-*\.*(\d{3})\)?\.*-*\s*(\d{3})\.*-*\s*(\d{4})$ Replace: +1 \($1\) $2-$3 

Tested against the following use cases.

18001234567 1 800 123 4567 1-800-123-4567 +18001234567 +1 800 123 4567 +1 (800) 123 4567 1(800)1234567 +1800 1234567 1.8001234567 1.800.123.4567 1--800--123--4567 +1 (800) 123-4567 
1

Adding up an example using above mentioned solutions on jsfiddle. I have modified the code a bit as per my clients requirement. Hope this also helps someone.

/^\s*(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *[x/#]{1}(\d+))?\s*$/ 

See Example Here

Phone number regex that I use: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

Covers:

  • 18001234567
  • 1 800 123 4567
  • +1 800 123-4567
  • +86 800 123 4567
  • 1-800-123-4567
  • 1 (800) 123-4567
  • (800)123-4567
  • (800) 123-4567
  • (800)1234567
  • 800-123-4567
  • 800.123.4567

try this for Pakistani users .Here's a fairly compact one I created.

((\+92)|0)[.\- ]?[0-9][.\- ]?[0-9][.\- ]?[0-9] 

Tested against the following use cases.

+92 -345 -123 -4567 +92 333 123 4567 +92 300 123 4567 +92 321 123 -4567 +92 345 - 540 - 5883 
1

Starting with @Ravi's answer, I also applied some validation rules for the NPA (Area) Code.

In particular:

  • It should start with a 2 (or higher)
  • It cannot have "11" as the second and third digits (N11).

There are a couple other restrictions, including reserved blocks (N9X, 37X, 96X) and 555, but I left those out, particularly because the reserved blocks may see future use, and 555 is useful for testing.

This is what I came up with:

^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$ 

Alternately, if you also want to match blank values (if the field isn't required), you can use:

(^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$|^$) 

My test cases for valid numbers (many from @Francis' answer) are:

18005551234 1 800 555 1234 +1 800 555-1234 +86 800 555 1234 1-800-555-1234 1.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 

My invalid test cases include:

(003) 555-1212 // Area code starts with 0 (103) 555-1212 // Area code starts with 1 (911) 555-1212 // Area code ends with 11 180055512345 // Too many digits 1 800 5555 1234 // Prefix code too long +1 800 555x1234 // Invalid delimiter +867 800 555 1234 // Country code too long 1-800-555-1234p // Invalid character 1 (800) 555-1234 // Too many spaces 800x555x1234 // Invalid delimiter 86 800 555 1212 // Non-NA country code doesn't have + 

My regular expression does not include grouping to extract the digit groups, but it can be modified to include those.

1

Perhaps the easiest one compare to several others.

\(?\d+\)?[-.\s]?\d+[-.\s]?\d+ 

It matches the following:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789

1

I find this regular expression most useful for me for 10 digit contact number :

^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[789]\d{9}$ 

Reference:

Explanation:

enter image description here

5

The expressions for 1, 3 and 4 are quite similar, so you can use:

^([1-9]\d{2})([- .])(\d{3})$2(\d{4})$ 

Note that, depending on the language and brand of regexes used, you might need to put \2 instead of $2 or such matching might not be supported at all.

I see no good way to combine this with the format 2, apart from the obvious ^(regex for 1,3,4|regex for 2)$ which is ugly, clumsy and makes it hard to get out the parts of the numbers.

As for the area code, you can add (\+\d)? to the beginning to capture a single-digit area code (sorry, I don't know the format of your area codes).

How about this?

^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4} 

EDIT: I forgot about the () one. EDIT 2: Got the first 3 digit part wrong.

4

This code will match a US or Canadian phone number, and will also make sure that it is a valid area code and exchange:

^((\+1)?[\s-]?)?\(?[2-9]\d\d\)?[\s-]?[2-9]\d\d[\s-]?\d\d\d\d 

Test on Regex101.com

Above regex is a slight modification of @Francis Gagnon.

Objective : To detect any possible pattern a user can share their US phone number


Version 1:

^\s*(?:\+?(\d{1,3}))?[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$ 

Test it over here Codepen:

Explanation of the regex :


Version 2:

\s*(?:\+?(\d{1,3}))?[\W\D\s]^|()*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$ 

What is in it: The test cases can be a part of the string. In version one the test cases should be a start of a line to work.

Codepen:

Explanation of the regex :


If you can find a pattern that can fail please do comment i will fix it.

Test Cases: Pass

8 0 0 4 4 4 5 55 5 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 800 (555) 1234 800(555)1234 8 0 0 5 5 5 1 2 3 4 8.0.0.5.5.5.1.2.3.4 8-0-0-5-5-5-1-2-3-4 (8)005551234 (80)05551234 8(00)5551234 8@0@0@5551234 8/0/0/5/5/5/1/2/3/4 8*0*0*5*5*5*1*2*3*4 8:0:0:5:5:5:1:2:3:4 8,0,0,5,5,5,1,2,3,4 800,555,1234 800:555:1234 1-718-444-1122 718-444-1122 (718)-444-1122 17184441122 7184441122 718.444.1122 1718.444.1122 1-123-456-7890 1 123-456-7890 1 (123) 456-7890 1 123 456 7890 1.123.456.7890 +91 (123) 456-7890 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 18001234567 1 800 123 4567 1-800-123-4567 +18001234567 +1 800 123 4567 +1 (800) 123 4567 1(800)1234567 +1800 1234567 1.8001234567 1.800.123.4567 +1 (800) 123-4567 18001234567 1 800 123 4567 +1 800 123-4567 +86 800 123 4567 1-800-123-4567 1 (800) 123-4567 (800)123-4567 (800) 123-4567 (800)1234567 800-123-4567 800.123.4567 1231231231 123-1231231 123123-1231 123-123 1231 123 123-1231 123-123-1231 (123)123-1231 (123) 123-1231 (123) 123 1231 +99 1234567890 +991234567890 (555) 444-6789 555-444-6789 555.444.6789 555 444 6789 1 800 555 1234 +1 800 555-1234 +86 800 555 1234 1-800-555-1234 1.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 (003) 555-1212 (103) 555-1212 (911) 555-1212 18005551234 1 800 555 1234 +86 800-555-1234 1 (800) 555-1234 
2

I'm just throwing this answer in there since it solves a problem of mine, it's based off of @stormy's answer, but includes 3 digit country codes and more importantly can be used anywhere in a string, but won't match is it's not preceded by a space/start of the string and ending with a word boundary. This is useful so that it won't match random numbers in the middle of a URL or something

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b) 
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4} 

This is a more comprehensive version that will match as much as I can think of as well as give you group matching for country, region, first, and last.

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4})))) 

what about multiple numbers with "+" and seperate them with ";" "," "-" or " " characters?

I ended up with

const regexBase = '(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})?[-. )]*(\\d{3})[-. ]*(\\d{4,5})(?: *x(\\d+))?'; const phoneRegex = new RegExp('\\s*' + regexBase + '\\s*', 'g');

this was to allow for things like dutch numbers, for example

+358 300 20200

Here's a regex that matches North American numbers as well as international numbers such as for middle east.

^((\+|0{0,2})([0-9]){1,3})?[-.●\s]?\(?([0-9]{2,3})\)?[-.●\s]?([0-9]{3})[-.●\s]?([0-9]{4})$

This is my Regex the worked on US numbers in the FreeCodeCamp phone number challenge:

/^\d{3}(-|\s)\d{3}(-|\s)\d{4}$|^\d{10}$|^1\s\d{3}(-|\s)\d{3}(-|\s)\d{4}$|^(1\s?)?\(\d{3}\)(\s|\-)?\d{3}\-\d{4}$/ 

Matches:

555-555-5555 (555)555-5555 (555) 555-5555 555 555 5555 5555555555 1 555 555 5555 etc 

You Might Also Like