Regex IBAN
Beaucoup de regex IBAN trouvées en ligne supposent une structure tout-chiffres qui ne fonctionne que pour une poignée de pays (Allemagne, Autriche...). La plupart des IBAN européens mélangent lettres et chiffres dans leur partie nationale. Voici un motif générique conforme à la norme ISO 13616, comparé à des tentatives réelles qui échouent dès qu'on change de pays.
/^[A-Z]{2}[0-9]{2}[A-Z0-9]{11,30}$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — tentative de l'auteur de la question (structure figée sur l'Allemagne) | ^[a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}(?:[a-zA-Z0-9]?){0,16}$ | 19 / 20 | sûr |
| Stack Overflow — réponse à 65 votes, portée explicitement limitée à DE/AT/FR (4 groupes de 4 chiffres) | ^[A-Z]{2}[0-9]{2}(?:[0-9]{4}){4}(?:[0-9]{1,2})?$ | 11 / 20 | sûr |
| Stack Overflow — variante simplifiée de la même réponse (tout-chiffres, longueur 18-20) | ^[A-Z]{2}(?:[0-9]){18,20}$ | 11 / 20 | sûr |
Implémentation
const re = new RegExp("^[A-Z]{2}[0-9]{2}[A-Z0-9]{11,30}$", "");
re.test(input);Limites
- Valide seulement la forme générale, jamais la clé de contrôle (algorithme MOD 97-10 défini par ISO 7064) : une chaîne peut avoir la bonne forme et être un IBAN totalement invalide. Voir la page dédiée à l'algorithme si tu dois vérifier la clé réellement.
- N'impose pas la longueur exacte par pays (15 à 34 caractères selon le pays, ex. toujours 22 pour l'Allemagne, toujours 27 pour la France) : une regex générique ne peut pas connaître cette table sans la dupliquer et la maintenir à jour.
- N'exige aucun espace, mais n'en interdit pas non plus l'usage réel (les IBAN sont couramment affichés par groupes de 4) : à normaliser (retirer les espaces, mettre en majuscule) avant de tester avec ce motif.
- Un code pays à 2 lettres syntaxiquement valide (ex. « XX ») n'est pas forcément un pays qui émet des IBAN — la liste des pays participants évolue et n'est pas du ressort d'une regex.