Regex US phone number
The reference question's top-voted answer (411 votes) has a real flaw flagged in a comment: its parentheses around the area code are each independently optional, letting "(212 456 7890" (an opening parenthesis with no closing one) through. A third, very permissive attempt turns out to be outright vulnerable to ReDoS per our analysis (polynomial complexity, verified on a string of plain spaces): its first two quantifiers can both consume the same space character. A comment on a related question flags a second real rule ignored by the question author's own attempt: a US area code can never start with 0 or 1 (the NANP numbering plan). Here's a safe pattern that fixes all three points, compared against the 3 real attempts.
/^(?:\+?1[-.\s]?)?(?:\([2-9]\d{2}\)|[2-9]\d{2})[-.\s]?[2-9]\d{2}[-.\s]?\d{4}(?:\s*x\d+)?$/ipasses 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — réponse la plus votée (411 votes), parenthèses non appariées (bug signalé en commentaire : accepte « (212 456 7890 ») | ^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$ | 13 / 20 | safe |
| Stack Overflow — tentative de l'auteur de la question, non ancrée en fin de chaîne, autorise un indicatif commençant par 1 (bug signalé en commentaire, contraire au plan NANP) | ^[1-9]\d{2}-\d{3}-\d{4} | 11 / 20 | safe |
| Stack Overflow — réponse à 247 votes, très permissive, accepte des séparateurs répétés à volonté et aucune contrainte NANP | ^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$ | 15 / 20 | vulnerable ( …) |
Implementation
const re = new RegExp("^(?:\\+?1[-.\\s]?)?(?:\\([2-9]\\d{2}\\)|[2-9]\\d{2})[-.\\s]?[2-9]\\d{2}[-.\\s]?\\d{4}(?:\\s*x\\d+)?$", "i");
re.test(input);Limits
- Valide uniquement la FORME : ne vérifie ni qu'un indicatif régional donné est réellement attribué par le plan NANP, ni que le numéro complet correspond à une ligne active.
- N'accepte qu'un préfixe pays « 1 » (Amérique du Nord) : les autres formats internationaux (« +44 », « +33 »...) ne sont volontairement pas couverts, conformément à l'intitulé de la question source qui cible spécifiquement le format américain.
- N'impose pas la cohérence des séparateurs entre les groupes de chiffres : « 212-456.7890 » (tiret puis point) est accepté aussi bien que « 212-456-7890 », ce qui est correct pour la validation mais ne normalise pas l'affichage.
- Ne reconnaît que l'extension au format « x1234 » : la forme alternative « ext. 1234 », également répandue, n'est pas couverte par ce motif.