Regex Mexican phone number
Since 3 August 2019, Mexico dials 10 digits for every number, landline or mobile: the 01 (long-distance) prefix and the 044 and 045 (mobile) prefixes were removed. A number is therefore a 2- or 3-digit lada code (55 Mexico City, 33 Guadalajara, 81 Monterrey, 222 Puebla) followed by 8 or 7 digits, with +52 from abroad. The real attempts I read do not follow that rule: validator.js's regex accepts '01' and '1' before 10 or 11 digits, CakePHP's accepts 8- or 13-digit numbers, and sent.dm's accepts only an unspaced +52. Here's a pattern enforcing 10 digits and a first digit from 2 to 9, compared against those attempts.
/^(?:(?:\+|00)52 ?(?:1 ?)?)?(?:[2-9][0-9][ -]?[0-9]{4}|[2-9][0-9]{2}[ -]?[0-9]{3}|\([2-9][0-9]\) ?[0-9]{4}|\([2-9][0-9]{2}\) ?[0-9]{3})[ -]?[0-9]{4}$/passes 35/35 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| validator.js (es-MX) — « (1|01)? » accepte les anciens préfixes : « 01 55 1234 5678 » (sans espaces : « 015512345678 ») passe ; « \d{10,11} » accepte un premier chiffre 0 ou 1 (« 0000000000 ») et 11 chiffres sans lien avec le préfixe ; aucun séparateur (« 55 1234 5678 » rejeté) | ^(\+?52)?(1|01)?\d{10,11}$ | 18 / 35 | safe |
| sent.dm (guide du fournisseur, regex de base) — « +52 » obligatoire et collé : tout format national (« 55 1234 5678 », « 5512345678 ») et tout séparateur sont rejetés, y compris « +52 5512345678 » ; le premier chiffre 2-9 est correct | ^\+52[2-9]\d{9}$ | 18 / 35 | safe |
| CakePHP localized (MxValidation::phone) — accepte des numéros de 8 ou 13 chiffres (« 12345678 », « 0155123456789 ») et un premier chiffre 0 ou 1 ; pas de +52 ; « (55)1234-5678 » passe, « (55) 1234-5678 » avec espace est rejeté | ^(\d{8}|\d{10}|\d{13}|((\d{2}[-,\s]){4}\d{2})|\(\d{3}\)\d{3}-\d{4}|\(\d{2}\)\d{4}-\d{4}|\d{3}[-,\s]\d{2}[-,\s]\d{8})$ | 15 / 35 | safe |
Implementation
const re = new RegExp("^(?:(?:\\+|00)52 ?(?:1 ?)?)?(?:[2-9][0-9][ -]?[0-9]{4}|[2-9][0-9]{2}[ -]?[0-9]{3}|\\([2-9][0-9]\\) ?[0-9]{4}|\\([2-9][0-9]{2}\\) ?[0-9]{3})[ -]?[0-9]{4}$", "");
re.test(input);Limits
- Valide seulement la FORME : ne vérifie pas que le numéro est attribué ni que la clé lada existe : tout premier chiffre de 2 à 9 passe. libphonenumber liste les clés réelles, que ce motif ne reprend pas.
- Les anciens préfixes 01 (longue distance), 044 et 045 (mobiles), supprimés le 3 août 2019, sont rejetés. L'ancien format international « +52 1 55… » des mobiles est en revanche accepté par tolérance.
- Fixes et mobiles ont désormais la même forme : le motif ne les distingue pas. Les numéros gratuits 800 et 888 ont aussi 10 chiffres et passent ; les numéros 900 et 300 également.
- Séparateurs : espace ou tiret facultatifs en positions 2-4-4 ou 3-3-4 ; parenthèses autour de la clé lada acceptées si elles sont appariées. Les points et les extensions sont rejetés.
Phone numbers for other countries
- Australian phone number
- Belgian phone number
- Brazilian phone number
- Canadian phone number
- Chinese phone number
- Dutch phone number
- French phone number
- German phone number
- Italian phone number
- Japanese 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