Regex IBAN
Many IBAN regexes found online assume an all-digit structure that only works for a handful of countries (Germany, Austria...). Most European IBANs mix letters and digits in their national part. Here's a generic pattern compliant with ISO 13616, compared against real attempts that fail as soon as the country changes.
/^[A-Z]{2}[0-9]{2}[A-Z0-9]{11,30}$/passes 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
const re = new RegExp("^[A-Z]{2}[0-9]{2}[A-Z0-9]{11,30}$", "");
re.test(input);Limits
- 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.