Regex numéro de carte American Express
American Express documente ses numéros dans son guide marchand : ils commencent par 34 ou 37 et comptent 15 chiffres (groupés 4-6-5). La forme est donc très simple, et la tentative de regular-expressions.info (identique à celle de validator.js) est déjà exacte. Les autres relues sont moins sûres : Cleave.js et php-credit-card-validator ne testent que le préfixe, et le motif de l'OWASP écrit « 3[4,7] », une classe qui accepte aussi la virgule, sans ancre de début : « 3,1234567890123 » passe. Voici le motif exact, avec un corpus plus rigoureux, comparé à ces tentatives.
/^3[47][0-9]{13}$/passe 22/22 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| regular-expressions.info (idem validator.js) — exacte : sert de référence | ^3[47][0-9]{13}$ | 22 / 22 | sûr |
| 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 | indéterminé |
| Cleave.js — motif de saisie progressive sans ancre de fin : « 34 » seul et 16 chiffres passent | ^3[47]\d{0,13} | 15 / 22 | sûr |
| php-credit-card-validator — seulement le préfixe : toute longueur passe | ^3[47] | 15 / 22 | sûr |
Implémentation
const re = new RegExp("^3[47][0-9]{13}$", "");
re.test(input);Limites
- 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.