Regex ISIN code
An ISIN is 2 country-code letters + 9 alphanumeric characters + 1 check digit - but a regex republished identically on GeeksforGeeks, Tutorialspoint and neveropen.tech only counts 8 characters for the alphanumeric part instead of 9. A widely-cited GitHub gist restricts itself to the strict list of ISO 3166-1 country codes and therefore wrongly rejects special prefixes like "XS" (international bonds), which are perfectly valid. Here's a pattern that checks the full structure, compared against these three attempts and the check digit none of them actually compute.
/^[A-Z]{2}[A-Z0-9]{9}[0-9]$/passes 22/22 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| GeeksforGeeks (republié à l'identique sur Tutorialspoint et neveropen.tech) — ne compte que 8 caractères pour la partie alphanumérique au lieu de 9, un chiffre manquant sur les 12 requis | ^[A-Z]{2}[-]{0,1}[0-9A-Z]{8}[-]{0,1}[0-9]{1}$ | 13 / 22 | safe |
| ExtensionMethod.NET (C#) — non ancrée, et la classe du dernier caractère inclut les lettres alors que la clé de contrôle est toujours un chiffre | [A-Z]{2}([A-Z0-9]){10} | 16 / 22 | safe |
| Gist GitHub (simonellistonball) — liste stricte des codes ISO 3166-1, rejette à tort les préfixes spéciaux valides comme XS (obligations internationales), EU, QS, QT, XA-XF, XK | ^(AD|AE|AF|AG|AI|AL|AM|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BL|BM|BN|BO|BQ|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|CR|CU|CV|CW|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EE|EG|EH|ER|ES|ET|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MF|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|SS|ST|SV|SX|SY|SZ|TC|TD|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TR|TT|TV|TW|TZ|UA|UG|UM|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|YE|YT|ZA|ZM|ZW)([0-9A-Z]{9})([0-9])$ | 20 / 22 | safe |
Implementation
const re = new RegExp("^[A-Z]{2}[A-Z0-9]{9}[0-9]$", "");
re.test(input);Limits
- Valide seulement la FORME (2 lettres + 9 alphanumériques + 1 chiffre) : ne calcule pas la clé de contrôle de Luhn appliquée après conversion des lettres en chiffres (A=10…Z=35) — un ISIN syntaxiquement valide selon ce motif peut avoir une clé fausse et ne correspondre à aucun titre réellement enregistré.
- N'exclut aucun code pays de 2 lettres invalide en 1ʳᵉ position : la norme autorise à la fois les codes ISO 3166-1 et des préfixes spéciaux (XS, EU, QS, QT, XA-XF, XK) pour les émetteurs supranationaux — la liste complète n'est pas encodable simplement dans une regex sans la reproduire en dur.
- Ne consulte aucun registre officiel : seule une base de données d'un dépositaire central de titres (ou de l'ANNA, l'Association of National Numbering Agencies) confirme qu'un ISIN est réellement attribué et actif.
- Exige une chaîne de 12 caractères sans séparateur : contrairement à l'IMEI ou au SIREN, l'ISIN ne s'écrit jamais avec des tirets ou des espaces dans sa forme officielle — toute variante avec séparateurs doit être normalisée avant validation.