Phone validation regex
Asked Answered
D

18

69

I'm using this pattern to check the validation of a phone number

^[0-9\-\+]{9,15}$

It's works for 0771234567 and +0771234567, but I want it to works for 077-1234567 and +077-1234567 and +077-1-23-45-67 and +077-123-45-6-7

What should I change in the pattern?

Downwash answered 26/12, 2011 at 8:37 Comment(2)
Did you ever find a sufficient solution?Uneventful
If you are trying to do this, you are probably doing it wrong. Phone numbers are of varying lengths, include different country codes and in general are wierder than you think. Python and Java both have libraries that will parse phone numbers contextually and you should be using those kind of tools instead of trying to get a regex to do the job.Lexie
U
42

Please refer to this SO Post

example of a regular expression in jquery for phone numbers

/\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/
  • (123) 456 7899
  • (123).456.7899
  • (123)-456-7899
  • 123-456-7899
  • 123 456 7899
  • 1234567899

are supported

Uneventful answered 26/12, 2011 at 20:58 Comment(2)
This allows illegal/Invalid #s including the following 234-911-5678 & 314-159-2653 & 123-234-5678Topnotch
letters also passFlocculus
T
28

enter image description hereThis solution actually validates the numbers and the format. For example: 123-456-7890 is a valid format but is NOT a valid US number and this answer bears that out where others here do not.


If you do not want the extension capability remove the following including the parenthesis: (?:\s*(?:#|x.?|ext.?|extension)\s*(\d+)\s*)? :)

edit (addendum) I needed this in a client side only application so I converted it. Here it is for the javascript folks:

var myPhoneRegex = /(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})\s*(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+)\s*)?$/i;
if (myPhoneRegex.test(phoneVar)) {
    // Successful match
} else {
    // Match attempt failed
}

hth. end edit

This allows extensions or not and works with .NET

(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$

To validate with or without trailing spaces. Perhaps when using .NET validators and trimming server side use this slightly different regex:

(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]‌​)\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]‌​|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})\s*(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+)\s*)?$

All valid:

1 800 5551212

800 555 1212

8005551212

18005551212

+1800 555 1212 extension65432

800 5551212 ext3333

Invalid #s

234-911-5678

314-159-2653

123-234-5678


EDIT: Based on Felipe's comment I have updated this for international.

Based on what I could find out from here and here regarding valid global numbers

This is tested as a first line of defense of course. An overarching element of the international number is that it is no longer than 15 characters. I did not write a replace for all the non digits and sum the result. It should be done for completeness. Also, you may notice that I have not combined the North America regex with this one. The reason is that this international regex will match North American numbers, however, it will also accept known invalid # such as +1 234-911-5678. For more accurate results you should separate them as well.

Pauses and other dialing instruments are not mentioned and therefore invalid per E.164

\(?\+[0-9]{1,3}\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})?

With 1-10 letter word for extension and 1-6 digit extension:

\(?\+[0-9]{1,3}\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})? ?(\w{1,10}\s?\d{1,6})?

Valid International: Country name for ref its not a match.

+55 11 99999-5555 Brazil

+593 7 282-3889 Ecuador

(+44) 0848 9123 456 UK

+1 284 852 5500 BVI

+1 345 9490088 Grand Cayman

+32 2 702-9200 Belgium

+65 6511 9266 Asia Pacific

+86 21 2230 1000 Shanghai

+9124 4723300 India

+821012345678 South Korea

And for your extension pleasure

+55 11 99999-5555 ramal 123 Brazil

+55 11 99999-5555 foo786544 Brazil

Enjoy

Topnotch answered 5/9, 2013 at 0:50 Comment(11)
Why this number is invalid? +55 11 99999-5555Presence
Looks like i need to update for Brazil (International) I will work on this and update the answer. Good catch.Topnotch
Valid numbers in Brazil: +55.19.99999-9999, 19 4444-4444, (19)99999999 - should be nice include the translation of "extension" in some main languages like: "ramal" in Portuguese but also: Spanish, Italian, Japan etc. - OR maybe let the user type any arbitrary char followed by a number after last number like: +55.19.99999-9999 ramal 123 or +55.19.99999-9999 xpto 123Presence
I'm not sure if your regex support this, but symbols like #, comma (,), semicolon (;) and other symbols can have special meaning. In some places a pause is needed for example to type the extension. So this should be also valid: +55 11 99999-5555, , , 445 - Look at this: support.apple.com/kb/PH18551?locale=en_USPresence
@FelipeMicaroniLalli, I have updated the answer to include international.Topnotch
In some countries in Europe it is accepted to have phone number like this:Massacre
+31 6 11 11 11 11 (the Netherlands) or to use '00' instead of '+', so if you want coverage for these numbers too, you can use the extended version: /(?\+?[0-9]{1,3})? ?-?[0-9]{1,3} ?-?[0-9]{2,5} ?-?[0-9]{2,5}( ?-?[0-9]{2,5})? ?(\w{1,10}\s?\d{1,6})?/Massacre
Can you help me with Danish phone number? its look like this en.wikipedia.org/wiki/Telephone_numbers_in_DenmarkFilmer
Thanks for editing your answer just as I was reading it, but why does your new regex include this extension part? What is it for?Annisannissa
Included as extensions are often requested. eg 1 800 555 1212 x5434Topnotch
@nir I hope this solved your issue. We should mark as the answer if it is the actual answer.Topnotch
K
18

I have a more generic regex to allow the user to enter only numbers, +, -, whitespace and (). It respects the parenthesis balance and there is always a number after a symbol.

^([+]?[\s0-9]+)?(\d{3}|[(]?[0-9]+[)])?([-]?[\s]?[0-9])+$

false, ""
false, "+48 504 203 260@@"
false, "+48.504.203.260"
false, "+55(123) 456-78-90-"
false, "+55(123) - 456-78-90"
false, "504.203.260"
false, " "
false, "-"
false, "()"
false, "() + ()"
false, "(21 7777"
false, "+48 (21)"
false, "+"
true , " 1"
true , "1"
true, "555-5555-555"
true, "+48 504 203 260"
true, "+48 (12) 504 203 260"
true, "+48 (12) 504-203-260"
true, "+48(12)504203260"
true, "+4812504203260"
true, "4812504203260
Kyd answered 14/11, 2018 at 10:20 Comment(0)
H
12

Consider:

^\+?[0-9]{3}-?[0-9]{6,12}$

This only allows + at the beginning; it requires 3 digits, followed by an optional dash, followed by 6-12 more digits.

Note that the original regex allows 'phone numbers' such as 70+12---12+92, which is a bit more liberal than you probably had in mind.


The question was amended to add:

+077-1-23-45-67 and +077-123-45-6-7

You now probably need to be using a regex system that supports alternatives:

^\+?[0-9]{3}-?([0-9]{7}|[0-9]-[0-9]{2}-[0-9]{2}-[0-9]{2}|[0-9]{3}-[0-9]{2}-[0-9]-[0-9])$

The first alternative is seven digits; the second is 1-23-45-67; the third is 123-45-6-7. These all share the optional plus + followed by 3 digits and an optional dash - prefix.

The comment below mentions another pattern:

+077-12-34-567

It is not at all clear what the general pattern should be - maybe one or more digits separated by dashes; digits at front and back?

^\+?[0-9]{3}-?[0-9](-[0-9]+)+$

This will allow the '+077-' prefix, followed by any sequence of digits alternating with dashes, with at least one digit between each dash and no dash at the end.

Headlock answered 26/12, 2011 at 8:42 Comment(1)
Thanks, but what about this format: +077-12-34-567. I want it to be somthing global.Downwash
P
6
/^[0-9\+]{1,}[0-9\-]{3,15}$/

so first is a digit or a +, then some digits or -

Peraza answered 25/7, 2013 at 14:38 Comment(0)
S
6

Here is the regex for Ethiopian phone numbers (EthioTelecom and Safaricom). For my fellow Ethiopian developers ;)

phoneExp = /^(^\+251|^251|^0)?(9|7)\d{8}$/;

It matches the following (restrict any unwanted character in start and end position)

  • +251912345678
  • 251912345678
  • 0912345678
  • 912345678
  • +251712345678
  • 251712345678
  • 0712345678
  • 712345678

You can test it on this site regexr.

Seismism answered 19/6, 2020 at 13:50 Comment(0)
B
5

First test the length of the string to see if it is between 9 and 15.

Then use this regex to validate:

^\+?\d+(-\d+)*$

This is yet another variation of the normal* (special normal*)* pattern, with normal being \d and special being -.

Bimah answered 26/12, 2011 at 10:48 Comment(4)
If for some reason you MUST do the length with regex though, try this: ^(?=.{9})(?!.{16})\+?\d+(-\d+)*$. But the solition with checking the length is cleaner imho ;)Corrosive
@Corrosive ouch :p Might as well have written (?=.{9,15}) in this case ;)Bimah
Then you need at least an $, but i'm not sure whether it works with multiple $'s, but if it does that's a bit cleaner indeed.Corrosive
It does work, since lookaround operators are anchors and won't consume anything. But it means going over the input twice... ie, (?=.{9,15}$)Bimah
C
5

I tried :

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

I took care of special country codes like 1-97... as well. Here are the numbers I tested against (from Puneet Lamba and MCattle):

***** PASS *****
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
(+230) 5 911 4450
123345678
(1) 345 654 67
+1 245436
1-976 33567
(1-734) 5465654
+(230) 2 345 6568
***** CORRECTLY FAILING *****
(003) 555-1212
(103) 555-1212
(911) 555-1212
1-800-555-1234p
800x555x1234
+1 800 555x1234
***** FALSE POSITIVES *****
180055512345
1 800 5555 1234
+867 800 555 1234
1 (800)  555-1234
86 800 555 1212

Originally posted here: Regular expression to match standard 10 digit phone number

Coeternity answered 17/9, 2016 at 16:15 Comment(0)
S
3
^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

Matches the following cases:

123-456-7890

(123) 456-7890

123 456 7890

123.456.7890

+91 (123) 456-7890

Sinless answered 21/9, 2017 at 10:52 Comment(0)
T
3

Try this

\+?\(?([0-9]{3})\)?[-.]?\(?([0-9]{3})\)?[-.]?\(?([0-9]{4})\)?

It matches the following cases

  • +123-(456)-(7890)
  • +123.(456).(7890)
  • +(123).(456).(7890)
  • +(123)-(456)-(7890)
  • +123(456)(7890)
  • +(123)(456)(7890)
  • 123-(456)-(7890)
  • 123.(456).(7890)
  • (123).(456).(7890)
  • (123)-(456)-(7890)
  • 123(456)(7890)
  • (123)(456)(7890)

For further explanation on the pattern CLICKME

Thralldom answered 22/4, 2019 at 10:43 Comment(1)
Thanks for calling my attention to that. It is in good shape now @TotoThralldom
R
1
The following regex matches a '+' followed by n digits


    var mobileNumber = "+18005551212";
    var regex = new RegExp("^\\+[0-9]*$");
    var OK = regex.test(mobileNumber);

    if (OK) {
      console.log("is a phone number");
    } else {
      console.log("is NOT a phone number");  
    }
Ribwort answered 4/6, 2014 at 0:49 Comment(0)
A
0
^+?\d{3}-?\d{2}-?\d{2}-?\d{3}$

You may try this....

How about this one....Hope this helps...

^(\\+?)\d{3,3}-?\d{2,2}-?\d{2,2}-?\d{3,3}$
Ashkhabad answered 26/12, 2011 at 9:13 Comment(4)
Their isn't option to do it someting global? so even it works for 0-7-7-1-2-3-4-5-6-7?Downwash
^(\+?)\d{3,3}(\-?)\d{2,2}(\-?)\d{2,2}(\-?)\d{3,3}$....Either of the two shall work...I'm unable to check their veracity at the moment...Ashkhabad
@Nir:If the answers are not working out, feel free to share... Or if they have solved your troubles, care to accept them.Ashkhabad
I want to do it for any case and any combination of digits and dashesDownwash
M
0
  ^[0-9\-\+]{9,15}$ 

would match 0+0+0+0+0+0, or 000000000, etc.

  (\-?[0-9]){7}

would match a specific number of digits with optional hyphens in any position among them.

What is this +077 format supposed to be?

It's not a valid format. No country codes begin with 0.

The digits after the + should usually be a country code, 1 to 3 digits long.

Allowing for "+" then country code CC, then optional hyphen, then "0" plus two digits, then hyphens and digits for next seven digits, try:

  ^\+CC\-?0[1-9][0-9](\-?[0-9]){7}$

Oh, and {3,3} is redundant, simplifes to {3}.

Marquardt answered 8/11, 2012 at 19:10 Comment(0)
O
0

This regex matches any number with the common format 1-(999)-999-9999 and anything in between. Also, the regex will allow braces or no braces and separations with period, space or dash. "^([01][- .])?(\(\d{3}\)|\d{3})[- .]?\d{3}[- .]\d{4}$"

Opening answered 25/6, 2014 at 14:37 Comment(0)
M
0

Adding to @Joe Johnston's answer, this will also accept:

+16444444444,,241119933

(Required for Apple's special character support for dial-ins - https://support.apple.com/kb/PH18551?locale=en_US)

\(?\+[0-9]{1,3}\)? ?-?[0-9]{1,3} ?-?[0-9]{3,5} ?-?[0-9]{4}( ?-?[0-9]{3})? ?([\w\,\@\^]{1,10}\s?\d{1,10})?

Note: Accepts upto 10 digits for extension code

Moorish answered 28/8, 2018 at 8:50 Comment(0)
I
0
/^(([+]{0,1}\d{2})|\d?)[\s-]?[0-9]{2}[\s-]?[0-9]{3}[\s-]?[0-9]{4}$/gm

https://regexr.com/4n3c4

Tested for

+94 77 531 2412

+94775312412

077 531 2412

0775312412

77 531 2412

// Not matching

77-53-12412

+94-77-53-12412

077 123 12345

77123 12345

Iwo answered 18/10, 2019 at 6:12 Comment(1)
There are a number of issues with this regex: 1. Country codes can have up to three numbers. 2. You are checking the country code for a digit, this also includes ٠١٢٣٤٥٦٧٨٩ # ARABIC-INDIC (Source: unix.stackexchange.com/a/414230)Swindle
A
0

JS code:

function checkIfValidPhoneNumber(input){
    "use strict";
    if(/^((\+?\d{1,3})?[\(\- ]?\d{3,5}[\)\- ]?)?(\d[.\- ]?\d)+$/.test(input)&&input.replace(/\D/g,"").length<=15){
        return true;
    } else { 
        return false;
    }
}

It may be primitive in terms of checking phone number, but it checks that input text is compliant with E.164 recommendation.

  1. Maximum phone length is 15 digits
  2. Country code consists of 1 to 3 digits, could be preceded with plus (could be omitted)
  3. Region (network) code consists of 3 to 5 digits (could be omitted but only if country code is omitted)

It allows some delimiters in phone number and around region code (.- ) For example:

+7(918)000-12-34

911

1-23456-789.10.11.12

all are compliant with E.164 and validated

About answered 15/7, 2021 at 14:59 Comment(0)
S
0

for all phone number format:

/^\+?([87](?!95[5-7]|99[08]|907|94[^09]|336)([348]\d|9[0-6789]|7[01247])\d{8}|[1246]\d{9,13}|68\d{7}|5[1-46-9]\d{8,12}|55[1-9]\d{9}|55[138]\d{10}|55[1256][14679]9\d{8}|554399\d{7}|500[56]\d{4}|5016\d{6}|5068\d{7}|502[345]\d{7}|5037\d{7}|50[4567]\d{8}|50855\d{4}|509[34]\d{7}|376\d{6}|855\d{8,9}|856\d{10}|85[0-4789]\d{8,10}|8[68]\d{10,11}|8[14]\d{10}|82\d{9,10}|852\d{8}|90\d{10}|96(0[79]|17[0189]|181|13)\d{6}|96[23]\d{9}|964\d{10}|96(5[569]|89)\d{7}|96(65|77)\d{8}|92[023]\d{9}|91[1879]\d{9}|9[34]7\d{8}|959\d{7,9}|989\d{9}|971\d{8,9}|97[02-9]\d{7,11}|99[^4568]\d{7,11}|994\d{9}|9955\d{8}|996[2579]\d{8}|998[3789]\d{8}|380[345679]\d{8}|381\d{9}|38[57]\d{8,9}|375[234]\d{8}|372\d{7,8}|37[0-4]\d{8}|37[6-9]\d{7,11}|30[69]\d{9}|34[679]\d{8}|3459\d{11}|3[12359]\d{8,12}|36\d{9}|38[169]\d{8}|382\d{8,9}|46719\d{10})$/
Sanitize answered 13/10, 2022 at 7:27 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.