Rexact
Cheatsheet

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+)?$/i
passes 20/20 cases

Comparison of existing patterns

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.