Regex Visa card number
A Visa number starts with 4. Visa's 'numerics' FAQ mentions 16- or 19-digit PANs; Wikipedia's table adds 13 digits (old ranges), which Visa does not confirm. The attempts I read disagree on length: regular-expressions.info accepts only 13 or 16 digits (a 19-digit PAN is rejected), validator.js accepts 13 and 16 to 19 digits, so also 17 and 18, which nobody issues, Cleave.js and php-credit-card-validator only test the prefix, and the OWASP pattern leaves the end of its first branch unbounded. Here's a pattern accepting exactly 13, 16 and 19 digits, compared against those attempts.
/^4(?:[0-9]{12}|[0-9]{15}|[0-9]{18})$/passes 25/25 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| regular-expressions.info — correcte pour 13 et 16 chiffres mais refuse les PAN Visa de 19 chiffres | ^4[0-9]{12}(?:[0-9]{3})?$ | 24 / 25 | safe |
| validator.js (isCreditCard) — accepte 13 et 16 à 19 chiffres : les longueurs 17 et 18 passent | ^(?:4[0-9]{12})(?:[0-9]{3,6})?$ | 23 / 25 | safe |
| Cleave.js — motif de saisie progressive sans ancre de fin : « 4 » seul et 17 chiffres et plus passent | ^4\d{0,15} | 15 / 25 | safe |
| OWASP Validation Regex Repository — motif multi-marques : 13 chiffres refusés, première branche sans « $ » (17 à 20 chiffres et « 4242424242424242x » passent) | ^((4\d{3})|(5[1-5]\d{2})|(6011)|(7\d{3}))-?\d{4}-?\d{4}-?\d{4}|3[4,7]\d{13}$ | 16 / 25 | undetermined |
| php-credit-card-validator — seulement « commence par 4 » : toute longueur passe | ^4 | 15 / 25 | safe |
Implementation
const re = new RegExp("^4(?:[0-9]{12}|[0-9]{15}|[0-9]{18})$", "");
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 PAN de 13 chiffres sont acceptés d'après Wikipedia ; la FAQ de Visa ne cite que 16 et 19 chiffres. Si vous n'acceptez que les cartes actuelles, retirez la branche de 13 chiffres.
- Le motif n'identifie pas les sous-marques (Electron, débit) ni les plages 8 chiffres qui se chevauchent avec d'autres réseaux.
- Ne stockez ni ne journalisez de vrais numéros de carte (PCI DSS) ; n'utilisez que des numéros de test dans vos tests.