Rexact
Cheatsheet

Regex Mastercard card number

On October 22, 2016, Mastercard opened a new number range (2221-2720) to address the exhaustion of the historical 51-55 range - a dated comment on Stack Overflow's top-voted answer (247 votes) documents this live, even proposing a fix. That fix, when actually tested, turns out to leave a gap: prefixes 2230-2299 aren't covered by any of its branches. Here's a pattern that correctly covers both ranges, compared against the pre-2016 version, an overly permissive multi-card pattern, and that imperfect fix.

/^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$/
passes 20/20 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$", "");
re.test(input);

Limits

  • Valide seulement la FORME (préfixe et longueur) : ne vérifie pas la clé de Luhn, le dernier chiffre de contrôle que possède tout vrai numéro de carte — un numéro syntaxiquement valide selon ce motif peut ne correspondre à aucune carte réellement émise.
  • Les plages de préfixes (BIN/IIN) sont définies par les réseaux de cartes et peuvent évoluer : la plage 2221-2720 elle-même n'existe que depuis le 22 octobre 2016, et rien ne garantit qu'elle ne soit pas de nouveau étendue à l'avenir.
  • Ne couvre que Mastercard : Visa, American Express, Discover et les autres réseaux suivent des plages de préfixes et des longueurs différentes, chacun nécessitant son propre motif.
  • Exige une chaîne de 16 chiffres consécutifs sans séparateur : les espaces ou tirets couramment affichés sur une carte physique (« 5555 5555 5555 4444 ») doivent être retirés avant validation.