Regex American Express card number
American Express documents its numbers in its merchant guide: they start with 34 or 37 and have 15 digits (grouped 4-6-5). The shape is therefore very simple, and regular-expressions.info's attempt (identical to validator.js's) is already exact. The other attempts are less safe: Cleave.js and php-credit-card-validator only test the prefix, and the OWASP pattern writes '3[4,7]', a class that also accepts the comma, with no start anchor: '3,1234567890123' passes. Here is the exact pattern, with a stricter corpus, compared against those attempts.
/^3[47][0-9]{13}$/passes 22/22 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| regular-expressions.info (idem validator.js) — exacte : sert de référence | ^3[47][0-9]{13}$ | 22 / 22 | safe |
| OWASP Validation Regex Repository — « 3[4,7] » accepte la virgule et la seconde branche n'a pas d'ancre de début (« x371449635398431 » passe) | ^((4\d{3})|(5[1-5]\d{2})|(6011)|(7\d{3}))-?\d{4}-?\d{4}-?\d{4}|3[4,7]\d{13}$ | 18 / 22 | undetermined |
| Cleave.js — motif de saisie progressive sans ancre de fin : « 34 » seul et 16 chiffres passent | ^3[47]\d{0,13} | 15 / 22 | safe |
| php-credit-card-validator — seulement le préfixe : toute longueur passe | ^3[47] | 15 / 22 | safe |
Implementation
const re = new RegExp("^3[47][0-9]{13}$", "");
re.test(input);Limits
- Valide seulement la FORME (préfixe et longueur) : ni la clé de Luhn (le corpus contient un numéro de forme correcte et de clé fausse qui passe), ni l'existence du compte, ni la date d'expiration ou le CVV. Les espaces et tirets sont refusés : normalisez avant validation.
- Le code de sécurité (CID, 4 chiffres au recto) n'est pas couvert. Le groupement 4-6-5 est une présentation : le motif travaille sur les chiffres seuls.
- Ne stockez ni ne journalisez de vrais numéros de carte (PCI DSS) ; n'utilisez que des numéros de test dans vos tests.