Regex code devise ISO 4217
Un code devise ISO 4217 se limite structurellement à 3 lettres majuscules — mais sur 17 576 combinaisons possibles, seuls environ 180 codes sont réellement actifs à un instant donné, et la liste change (BYR→BYN en 2016, MRO→MRU en 2018, ZWL retiré en 2024). Une bibliothèque GitHub tente de coder cette liste en dur dans une regex, mais elle est restée figée à une version d'avant ces changements : elle contient encore les anciens codes retirés, et même des codes qui n'ont jamais été officiels (GGP, IMP, JEP — les livres de Guernesey, l'Île de Man et Jersey, jamais reconnus par l'ISO). Voici ce que la seule forme peut réellement garantir, comparé à ces tentatives et à leur péremption inévitable.
/^[A-Z]{3}$/passe 22/22 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — question à propos de la validation ISO 4217 en C# (score 1), regex utilisée en production avant que l'auteur ne la remette en question : accepte 1 à 3 lettres, insensible à la casse | ^[a-zA-Z]{1,3}$ | 19 / 22 | sûr |
| GitHub d4nyll/iso-helper — liste blanche figée avant 2016 : contient des codes officiellement retirés (BYR, MRO, STD, VEF, ZWD) et des codes qui n'ont jamais été des codes ISO 4217 officiels (GGP, IMP, JEP, SPL, TVD) | ^AED|AFN|ALL|AMD|ANG|AOA|ARS|AUD|AWG|AZN|BAM|BBD|BDT|BGN|BHD|BIF|BMD|BND|BOB|BRL|BSD|BTN|BWP|BYR|BZD|CAD|CDF|CHF|CLP|CNY|COP|CRC|CUC|CUP|CVE|CZK|DJF|DKK|DOP|DZD|EGP|ERN|ETB|EUR|FJD|FKP|GBP|GEL|GGP|GHS|GIP|GMD|GNF|GTQ|GYD|HKD|HNL|HRK|HTG|HUF|IDR|ILS|IMP|INR|IQD|IRR|ISK|JEP|JMD|JOD|JPY|KES|KGS|KHR|KMF|KPW|KRW|KWD|KYD|KZT|LAK|LBP|LKR|LRD|LSL|LYD|MAD|MDL|MGA|MKD|MMK|MNT|MOP|MRO|MUR|MVR|MWK|MXN|MYR|MZN|NAD|NGN|NIO|NOK|NPR|NZD|OMR|PAB|PEN|PGK|PHP|PKR|PLN|PYG|QAR|RON|RSD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|SLL|SOS|SPL|SRD|STD|SVC|SYP|SZL|THB|TJS|TMT|TND|TOP|TRY|TTD|TVD|TWD|TZS|UAH|UGX|USD|UYU|UZS|VEF|VND|VUV|WST|XAF|XCD|XDR|XOF|XPF|YER|ZAR|ZMW|ZWD$ | 16 / 22 | sûr |
| Gist GitHub (DoremyR3d) — liste blanche à jour (179 codes) au moment de sa publication, mais tout aussi condamnée à devenir obsolète au prochain amendement de l'ISO 4217 sans mécanisme de mise à jour | ^(?:AED|AFN|ALL|AMD|ANG|AOA|ARS|AUD|AWG|AZN|BAM|BBD|BDT|BGN|BHD|BIF|BMD|BND|BOB|BOV|BRL|BSD|BTN|BWP|BYN|BZD|CAD|CDF|CHE|CHF|CHW|CLF|CLP|CNY|COP|COU|CRC|CUC|CUP|CVE|CZK|DJF|DKK|DOP|DZD|EGP|ERN|ETB|EUR|FJD|FKP|GBP|GEL|GHS|GIP|GMD|GNF|GTQ|GYD|HKD|HNL|HRK|HTG|HUF|IDR|ILS|INR|IQD|IRR|ISK|JMD|JOD|JPY|KES|KGS|KHR|KMF|KPW|KRW|KWD|KYD|KZT|LAK|LBP|LKR|LRD|LSL|LYD|MAD|MDL|MGA|MKD|MMK|MNT|MOP|MRU|MUR|MVR|MWK|MXN|MXV|MYR|MZN|NAD|NGN|NIO|NOK|NPR|NZD|OMR|PAB|PEN|PGK|PHP|PKR|PLN|PYG|QAR|RON|RSD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|SLL|SOS|SRD|SSP|STN|SVC|SYP|SZL|THB|TJS|TMT|TND|TOP|TRY|TTD|TWD|TZS|UAH|UGX|USD|USN|UYI|UYU|UYW|UZS|VES|VND|VUV|WST|XAF|XAG|XAU|XBA|XBB|XBC|XBD|XCD|XDR|XOF|XPD|XPF|XPT|XSU|XTS|XUA|XXX|YER|ZAR|ZMW|ZWL)$ | 19 / 22 | sûr |
Implémentation
const re = new RegExp("^[A-Z]{3}$", "");
re.test(input);Limites
- Valide seulement la FORME (3 lettres majuscules) : sur les 17 576 combinaisons possibles, environ 17 400 ne correspondent à aucune devise réellement active — « XYZ » ou « ZZZ » passent ce test aussi facilement qu'EUR ou USD.
- Toute liste blanche de codes réels codée en dur dans une regex se périme dès le prochain amendement du Maintenance Agency ISO 4217 : les deux tentatives comparées ici le démontrent, l'une contenant déjà des codes retirés (BYR, MRO, STD, VEF, ZWD) et des codes n'ayant jamais été officiels (GGP, IMP, JEP).
- Ne distingue pas les codes de devise réelle des codes spéciaux ISO 4217 (métaux précieux comme XAU/XAG, fonds comme XDR, code de test XTS, code générique XXX) : ces codes sont structurellement valides mais ne représentent pas une monnaie ayant cours.
- La seule façon fiable de vérifier qu'un code est réellement actif est de le comparer à une source de données tenue à jour (bibliothèque maintenue, API), jamais une liste figée au moment de l'écriture du code.