Regex ISSN
Un ISSN, ce n'est pas juste « 8 chiffres » : la norme ISO 3297 impose un tiret entre les deux groupes de 4. La bibliothèque npm validator.js, très utilisée, le rend pourtant optionnel par défaut — et accepte même un « x » minuscule là où seul « X » majuscule est valide. Deux autres bibliothèques open source indépendantes (une finlandaise, une communautaire) reproduisent exactement le même défaut de tiret optionnel, preuve qu'une erreur se recopie facilement d'un projet à l'autre. Voici un motif qui respecte la présentation imposée par la norme, comparé à ces trois tentatives.
/^\d{4}-\d{3}[0-9X]$/passe 22/22 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js (bibliothèque npm très utilisée) — tiret optionnel par défaut alors que la norme l'impose, et insensible à la casse (« x » minuscule accepté) | ^\d{4}-?\d{3}[0-9X]$ | 19 / 22 | sûr |
| NatLibFi/issn-verify-js (Bibliothèque nationale de Finlande) — même défaut de tiret optionnel | ^\d{4}\-?\d{3}[0-9X]$ | 20 / 22 | sûr |
| Apache Commons Validator (Java, bibliothèque d'entreprise) — absence d'ancre de début, un préfixe arbitraire peut passer devant le motif selon la méthode d'appel | (?:ISSN )?(\d{4})-(\d{3}[0-9X])$ | 19 / 22 | sûr |
Implémentation
const re = new RegExp("^\\d{4}-\\d{3}[0-9X]$", "");
re.test(input);Limites
- Valide seulement la FORME (8 chiffres avec tiret) : ne calcule pas la clé de contrôle modulo 11 — un ISSN syntaxiquement valide selon ce motif peut avoir une clé fausse et ne correspondre à aucun périodique réellement enregistré.
- Ne consulte pas le registre du Centre International de l'ISSN (portal.issn.org) : seule une requête à ce registre confirme qu'un ISSN est réellement attribué et actif.
- Ne distingue pas l'ISSN d'un périodique imprimé de l'ISSN-L (« linking ISSN », qui identifie une même publication à travers ses différents supports) : les deux partagent exactement la même forme, seul le registre permet de les différencier.
- Le tiret est obligatoire dans ce motif, conformément à la présentation imposée par la norme ISO 3297 — contrairement à plusieurs bibliothèques réelles qui le rendent optionnel par erreur.