Regex JCB card number
According to the Discover Global Network bulletin (February 2017), the JCB range runs from 3528 to 3589 with 16 to 19 digits. The attempts I read are wider or narrower: regular-expressions.info accepts any 35xxx prefix on 16 digits only (plus the old 2131 and 1800 on 15 digits), Cleave.js and php-credit-card-validator only test '35'. Here's a pattern bounded to 3528-3589 with 16 to 19 digits, compared against those attempts.
/^35(?:2[89]|[3-8][0-9])[0-9]{12,15}$/passes 23/23 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| regular-expressions.info — 16 chiffres seulement ; 35xxx trop large (3500 ou 3599 passent) ; accepte aussi 2131 et 1800 sur 15 chiffres | ^(?:2131|1800|35\d{3})\d{11}$ | 16 / 23 | safe |
| Cleave.js — motif de saisie progressive sans ancre de fin : « 35 » seul et 20 chiffres passent | ^(?:35\d{0,2})\d{0,12} | 15 / 23 | safe |
| php-credit-card-validator — seulement « commence par 35 » : toute longueur passe | ^35 | 15 / 23 | safe |
Implementation
const re = new RegExp("^35(?:2[89]|[3-8][0-9])[0-9]{12,15}$", "");
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.
- Les anciennes plages JCB 2131/1800 (15 chiffres) sont exclues ; le bulletin signale en outre que 3528-3589 n'est activable qu'aux États-Unis par le réseau Discover. D'autres bibliothèques citent encore d'anciennes plages JCB (3088-3094, 3337-3349 notamment) : non vérifiées ici, non incluses.
- Ne stockez ni ne journalisez de vrais numéros de carte (PCI DSS) ; n'utilisez que des numéros de test dans vos tests.