Rexact
Cheatsheet

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

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.

Related pages