Regex numéro de carte Mastercard
Le 22 octobre 2016, Mastercard a ouvert une nouvelle plage de numéros (2221-2720) pour pallier l'épuisement de la plage historique 51-55 — un commentaire daté sur la réponse la plus votée de Stack Overflow (247 votes) le documente en direct, avec même un correctif proposé. Ce correctif, en le testant réellement, laisse pourtant passer un trou : les préfixes 2230-2299 ne sont couverts par aucune de ses branches. Voici un motif qui couvre correctement les deux plages, comparé à la version d'avant 2016, à un motif multi-cartes trop permissif, et à ce correctif imparfait.
/^(?: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}$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le 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 | sûr |
| Stack Overflow / regexpattern.com — motif « toutes cartes » (88 votes), portion Mastercard bien trop permissive | ^[25][1-7][0-9]{14}$ | 16 / 20 | sûr |
| 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 | sûr |
Implémentation
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);Limites
- 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.