Regex Canadian phone number
Canada shares the North American Numbering Plan (NANP) with the United States: +1, a 3-digit area code, a 3-digit exchange code starting with neither 0 nor 1, then 4 digits. What makes a number Canadian is the list of area codes (204, 416, 514, 604, 613...): jquery-validation's and validator.js's regexes accept any NANP-shaped area code, so '(212) 555-0123' (New York) passes as a Canadian number. The plan reserves 555-0100 to 555-0199 for fiction: '416 555 0123' is a good test example. Here's a pattern restricting area codes to the Canadian ones known to libphonenumber, compared against those attempts.
/^(?:(?:\+1|1)[ .-]?)?(?:(?:2(?:04|[23]6|[48]9|5[07]|[67]3)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|9(?:0[25]|42)|8(?:00|33|44|55|66|77|88))|\((?:2(?:04|[23]6|[48]9|5[07]|[67]3)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|9(?:0[25]|42)|8(?:00|33|44|55|66|77|88))\))[ .-]?[2-9][0-9]{2}[ .-]?[0-9]{4}$/passes 34/34 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| jquery-validation (phoneUS) — le plugin retire d'abord les espaces ; testée telle quelle, la regex rejette « 416 555 0123 » ; n'importe quel indicatif NANP américain passe (« 212-555-0123 », « (305)555-0123 ») ; « 1 » et « +1 » acceptés avec un tiret | ^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$ | 22 / 34 | safe |
| validator.js (en-CA, simple alias de en-US) — aucun contrôle de l'indicatif : « (212) 555-0123 » et « +1 305 555 0123 » passent ; refuse les points (« 416.555.0123 ») et les parenthèses non appariées ; accepte des formats mêlés comme « (416) 5550123 » | ^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$ | 30 / 34 | safe |
| sent.dm (guide du fournisseur, regex Canada) — « +1 » obligatoire et sans séparateur : tout format local (« 416-555-0123 ») est rejeté ; aucun contrôle de l'indicatif régional (« +12125550123 » passe) | ^\+1[2-9]\d{2}[2-9]\d{2}\d{4}$ | 18 / 34 | safe |
Implementation
const re = new RegExp("^(?:(?:\\+1|1)[ .-]?)?(?:(?:2(?:04|[23]6|[48]9|5[07]|[67]3)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|9(?:0[25]|42)|8(?:00|33|44|55|66|77|88))|\\((?:2(?:04|[23]6|[48]9|5[07]|[67]3)|3(?:06|43|54|6[578]|82)|4(?:03|1[68]|[26]8|3[178]|50|74)|5(?:06|1[49]|48|79|8[147])|6(?:04|[18]3|39|47|72)|7(?:0[59]|42|53|78|8[02])|8(?:[06]7|19|25|7[39])|9(?:0[25]|42)|8(?:00|33|44|55|66|77|88))\\))[ .-]?[2-9][0-9]{2}[ .-]?[0-9]{4}$", "");
re.test(input);Limits
- Valide seulement la FORME : ne vérifie pas que le numéro est attribué. Seuls l'indicatif régional (liste de libphonenumber, qui peut prendre du retard sur les nouveaux indicatifs et superpositions) et le premier chiffre 2-9 du code d'échange sont contrôlés ; les numéros 555-01xx sont des numéros fictifs, mais le motif les accepte comme n'importe quel autre.
- Un indicatif américain voisin (« 212 », « 305 ») est rejeté ; en revanche des indicatifs non canadiens attribués après la version de libphonenumber utilisée seraient rejetés à tort, et l'inverse pour de futurs indicatifs canadiens.
- Le préfixe +1 ou 1 est facultatif. Séparateur facultatif : espace, point ou tiret entre les trois blocs ; « 416-555.0123 » (mélangé) passe. Les extensions (« ext 5 », « x5 ») sont rejetées : le motif de telephone-us les accepte.
- Les numéros gratuits (800, 833, 844, 855, 866, 877, 888) sont acceptés, sans distinction du pays : ils sont communs aux États-Unis et au Canada.
Phone numbers for other countries
- Australian phone number
- Belgian phone number
- Brazilian phone number
- Chinese phone number
- Dutch phone number
- French phone number
- German phone number
- Italian phone number
- Japanese phone number
- Mexican phone number
- Norwegian phone number
- Polish phone number
- South African phone number
- Spanish phone number
- Swedish phone number
- Swiss phone number
- UK phone number
- US phone number
- All phone numbers by country