Regex ISO 4217 currency code
An ISO 4217 currency code is structurally just 3 uppercase letters - but out of 17,576 possible combinations, only about 180 codes are actually active at any given time, and the list changes (BYR to BYN in 2016, MRO to MRU in 2018, ZWL retired in 2024). A GitHub library tries to hardcode that list into a regex, but it's frozen at a version predating those changes: it still contains retired codes, and even codes that were never official (GGP, IMP, JEP - the pounds of Guernsey, the Isle of Man and Jersey, never recognized by ISO). Here's what pure structure can actually guarantee, compared against these attempts and their inevitable staleness.
/^[A-Z]{3}$/passes 22/22 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
const re = new RegExp("^[A-Z]{3}$", "");
re.test(input);Limits
- 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.