Regex ISRC
Un ISRC, ce n'est pas juste « 12 caractères » : les 2 premiers sont des lettres (code pays), pas n'importe quel alphanumérique. Une regex postée sur Microsoft Q&A n'ancre jamais le motif, donc n'importe quelle sous-chaîne de 12 caractères à l'intérieur d'un texte plus long est acceptée. Une autre, tirée d'un forum MusicBrainz pour extraire des ISRC depuis des relevés de cue-sheet, rend chaque tiret optionnel indépendamment — un format incohérent comme « US-RC1760-7839 » passe. Voici un motif qui valide la chaîne entière, comparé à ces deux tentatives et une troisième issue d'un vrai projet GitHub.
/^[A-Z]{2}[A-Z0-9]{3}[0-9]{7}$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Microsoft Q&A (1 vote utile) — non ancrée, matche n'importe quel sous-segment de 12 caractères à l'intérieur d'une chaîne plus longue | [A-Z]{2}[A-Z0-9]{3}[0-9]{7} | 15 / 20 | sûr |
| Forum MusicBrainz — conçu pour extraire un ISRC depuis du texte libre (relevés de cue-sheet), chaque tiret est optionnel indépendamment, un format incohérent comme « US-RC1760-7839 » passe | \b[A-Z]{2}\-?[A-Z0-9]{3}\-?[0-9]{2}\-?[0-9]{5}\b | 16 / 20 | sûr |
| GitHub David-Desmaisons/MusicCollection (ISRC.cs) — \w autorise l'underscore, absent de l'alphabet ISRC ; classe inactive/commentée dans le dépôt réel | ([A-Z]{2}-?\w{3}-?\d{2}-?\d{5}) | 14 / 20 | sûr |
Implémentation
const re = new RegExp("^[A-Z]{2}[A-Z0-9]{3}[0-9]{7}$", "");
re.test(input);Limites
- Valide seulement la FORME (2 lettres + 10 alphanumériques/chiffres) : ne consulte pas la base de données ISRC (registre géré par les agences nationales et l'IFPI) pour confirmer qu'un code est réellement attribué à un enregistrement.
- N'exclut aucun code pays à 2 lettres invalide : contrairement à un code devise ISO 4217, la liste des codes pays d'enregistrement ISRC suit globalement ISO 3166-1, mais avec quelques exceptions historiques qu'une simple regex ne peut pas encoder sans la reproduire en dur.
- Exige une chaîne de 12 caractères sans séparateur : la présentation conventionnelle groupée par tirets (« US-UAN-14-00011 »), courante à l'affichage, doit être retirée avant validation par ce motif.
- Le code registrant (3 caractères après le code pays) n'a de signification que par rapport au registre national qui l'a attribué : ce motif ne peut pas vérifier qu'un registrant donné a bien été délégué par l'agence ISRC du pays concerné.