Rexact
Cheatsheet

Regex numéro de téléphone français

Un numéro français s'écrit avec ou sans espaces, avec ou sans +33, avec ou sans le « (0) » après l'indicatif — la plupart des regex trouvées en ligne n'en gèrent qu'une partie. Voici un motif qui couvre les variantes réelles testées, comparé aux tentatives les plus discutées sur Stack Overflow.

/^(?:(?:\+|00)33[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)[1-9](?:(?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]?\d{3}){2})$/
passe 22/22 cas

Comparatif des patterns existants

SourcepatternScore sur le corpusReDoS
Stack Overflow — tentative initiale de l'auteur de la question (« mais c'est faux… »)^(\+33\s[1-9]{8})|(0[1-9]\s{8})$9 / 22sûr
Stack Overflow — réponse la plus votée (64 votes, Thomas Ayoub)^(?:(?:\+|00)33|0)\s*[1-9](?:[\s.-]*\d{2}){4}$20 / 22sûr
Stack Overflow — variante sans séparateurs (6 votes, Hugo Trial)^((\+)33|0|0033)[1-9](\d{2}){4}$15 / 22sûr

Implémentation

const re = new RegExp("^(?:(?:\\+|00)33[\\s.-]{0,3}(?:\\(0\\)[\\s.-]{0,3})?|0)[1-9](?:(?:[\\s.-]?\\d{2}){4}|\\d{2}(?:[\\s.-]?\\d{3}){2})$", "");
re.test(input);

Limites

  • Valide seulement la forme, jamais l'attribution réelle : un numéro syntaxiquement valide peut n'avoir jamais été distribué par l'ARCEP.
  • Ne distingue pas fixe/mobile/VoIP par la structure seule (06/07 mobile, 09 VoIP, 01-05 fixe géographique, 08 numéros spéciaux souvent surtaxés) : il faut une table de préfixes séparée pour ça.
  • Accepte des séparateurs incohérents mélangés dans un même numéro (ex. « 01.23-45 67.89 ») : ni ce motif ni la plupart des variantes trouvées en ligne ne l'interdisent explicitement.
  • Ne couvre pas les indicatifs des DOM-TOM (+590 Guadeloupe, +596 Martinique, +262 Réunion…) ni Monaco (+377), pourtant culturellement proches.

Pages liées