Regex ISRC
An ISRC isn't just "12 characters": the first 2 are letters (country code), not any alphanumeric. A regex posted on Microsoft Q&A never anchors the pattern, so any 12-character substring inside a longer text gets accepted. Another, taken from a MusicBrainz forum for extracting ISRCs from cue-sheet listings, makes each hyphen independently optional - an inconsistent format like "US-RC1760-7839" passes. Here's a pattern validating the whole string, compared against those two attempts and a third from a real GitHub project.
/^[A-Z]{2}[A-Z0-9]{3}[0-9]{7}$/passes 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
const re = new RegExp("^[A-Z]{2}[A-Z0-9]{3}[0-9]{7}$", "");
re.test(input);Limits
- 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é.