Rexact
Cheatsheet

Regex numéro de téléphone brésilien

Un numéro brésilien a un DDD (indicatif régional) à 2 chiffres, puis 9 chiffres commençant par 9 (mobile) ou 8 chiffres commençant par 2 à 5 (fixe). Tous les DDD de 11 à 99 n'existent pas : 10, 20, 23, 25, 26, 29… n'existent pas. Les tentatives réelles que j'ai relues acceptent presque tout ce qui ressemble à deux chiffres : le module Drupal « phone » accepte « (10) 91234-5678 » et « (11) 81234-5678 », la regex de LaravelLegends exige des parenthèses autour du DDD et rejette « 11961234567 », et validator.js accepte un fixe commençant par 1 ou 6. Voici un motif qui borne le DDD et le premier chiffre du numéro, comparé à ces tentatives.

/^(?:\+?55 ?)?\(?0?(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])\)? ?(?:9[0-9]{4}|[2-5][0-9]{3})-?[0-9]{4}$/
passe 26/26 cas

Comparatif des patterns existants

Implémentation

const re = new RegExp("^(?:\\+?55 ?)?\\(?0?(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579])\\)? ?(?:9[0-9]{4}|[2-5][0-9]{3})-?[0-9]{4}$", "");
re.test(input);

Limites

  • Valide seulement la FORME : ne vérifie pas que le numéro est attribué. La liste des DDD existants et les règles de premier chiffre viennent des métadonnées de libphonenumber, pas d'un texte d'ANATEL que je n'ai pas relu (la résolution actuelle, 749/2022, remplace celle de 2010).
  • Le mobile est modélisé comme « 9 + 8 chiffres » ; libphonenumber accepte encore des numéros de 8 chiffres commençant par 7 (« (11) 7123-4567 »), qui sont rejetés ici. Le zéro de tronc (« 011 »…) est accepté avant le DDD, avec ou sans parenthèses.
  • Accepte le préfixe +55 ou 55 facultatif, des parenthèses facultatives autour du DDD, une espace facultative et un tiret facultatif avant les 4 derniers chiffres. Les extensions et les formes avec points sont rejetées.
  • Aucune plage fictive officielle n'existe ; sauf les deux exemples de libphonenumber, les numéros du corpus sont synthétiques et ne correspondent à aucun abonné par construction.

Pages liées