Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regular expression matching E.164 formatted phone numbers

Tags:

regex

I need to add a regular expression that matches all possible valid E.164 formatted phone numbers.

This regex works fine for for North American phone numbers, but I need something that will work for international numbers as well:

^(+1|1)?([2-9]\d\d[2-9]\d{6})$

Example: +13172222222 matches 13172222222 still matches because +1 or 1 are optional 3172222222 still matches because +1 or 1 are optional 3171222222 does not match and is not a valid NANPA number.

Source: Freeswitch.org

I also came across this related question, but I think that it is way too crazy for my needs. In my case, I am simply validating an entry for a blacklist, which I'm comparing to incoming Twilio data; so, I care much less about weather a country code is valid. I really only need to test if a number matches the general E.164 form, rather than assuming it's a NANPA.

To be better understand what I need to match, here is an example from the Twilio Documentation:

All phone numbers in requests from Twilio are in E.164 format if possible. For example, (415) 555-4345 would come through as '+14155554345'. However, there are occasionally cases where Twilio cannot normalize an incoming caller ID to E.164. In these situations Twilio will report the raw caller ID string.

I want to match something like +14155554345, but not (415) 555-4345, 415555434, 555-4345 or 5554345. The regex should not restrict itself to only matching the US country code though. Basically, it should match the +xxxxxxxxxxx format. I also think the number could be longer, as there are multi-digit country codes, such as in the UK. T-Mobile's UK number is +447953966150 I'll update this if I can come up with a better example.

like image 281
Sean W. Avatar asked Jun 25 '11 16:06

Sean W.


People also ask

What is the maximum number of digits allowable in an e 164 telephone number?

E. 164 is an international numbering plan for public telephone systems in which each assigned number contains a country code (CC), a national destination code (NDC), and a subscriber number (SN). There can be up to 15 digits in an E. 164 number.

What is E 164 format India?

This number allows phone calls and text messages can be correctly routed to individual phones in different countries. E. 164 numbers are formatted [+] [country code] [subscriber number including area code] and can have a maximum of fifteen digits.

What is E 164 format Australia?

E. 164 defines a format for international telephone numbers. Numbers are usually prefixed with the plus sign (+), include the international country calling code and are limited to a maximum of 15 digits.


2 Answers

The accepted answer is good, except an E.164 number can have up to 15 digits. The specification also doesn't indicate a minimum, so I wouldn't necessarily count on 10.

It should be ^\+?[1-9]\d{1,14}$

See http://en.wikipedia.org/wiki/E.164

like image 180
Graham Davison Avatar answered Oct 22 '22 15:10

Graham Davison


I think until you have a great set of examples, you are best served by a flexible regex. This one will match a + followed by 10-14 digits.

^\+?\d{10,14}$ 

Broken down, this expression means: ^ Match begining of string. \+? Optionally match a + symbol. \d{10,14} Match between 10 and 14 digits. $ Ensure we are at the end of the string.

If you learn that a digit at a particular index must not be 1 or 0, then you can use the [2-9] at that position, like this:

^\+?\d{6,7}[2-9]\d{3}$ 

[2-9] means match any digit from 2 through 9 (don't match 0 or 1.)

like image 40
agent-j Avatar answered Oct 22 '22 16:10

agent-j