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
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — forme d'avant octobre 2016 de la réponse la plus votée, plage 2221-2720 absente (cf. commentaire daté de Slagmoth) | ^5[1-5][0-9]{14}$ | 14 / 20 | safe |
| Stack Overflow / regexpattern.com — motif « toutes cartes » (88 votes), portion Mastercard bien trop permissive | ^[25][1-7][0-9]{14}$ | 16 / 20 | safe |
| Stack Overflow — correctif proposé en commentaire par Slagmoth (2016-10-14), laisse un trou sur les préfixes 2230-2299 | ^(?:5[1-5][0-9]\d{1}|222[1-9]|2[3-6][0-9]\d{1}|27[01][0-9]|2720)([\ \-]?)\d{4}\1\d{4}\1\d{4}$ | 18 / 20 | safe |
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.