Regex ISBN (ISBN-10 ou ISBN-13)
La question de référence sur Stack Overflow part d'un vrai bug : un test ISBN-10 non ancré (« \d{9}(?:\d|X) ») reconnaît par erreur les 10 premiers chiffres de n'importe quel ISBN-13, à cause d'une simple recherche de sous-chaîne. Un tutoriel très copié (GeeksforGeeks) a un défaut plus subtil : son propre exemple de test valide « 1207199818865 » comme ISBN-13 correct, alors qu'un ISBN-13 doit obligatoirement commencer par 978 ou 979 (le préfixe Bookland/EAN attribué au livre) — leur motif ne vérifie que la longueur, pas le préfixe. Voici un motif qui distingue correctement les deux formats, comparé à ces deux tentatives et à une troisième bien trop restrictive.
/^(?:\d{9}[0-9Xx]|(?:978|979)\d{10})$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — tentative de l'auteur de la question, test non ancré (reconnaît les 10 premiers chiffres de n'importe quel ISBN-13) | \d{9}(?:\d|X) | 13 / 20 | sûr |
| GeeksforGeeks — motif très copié, vérifie la longueur (10 ou 13 chiffres) mais pas le préfixe 978/979, ni le X final de l'ISBN-10 | ^(?=(?:[^0-9]*[0-9]){10}(?:(?:[^0-9]*[0-9]){3})?$)[\d-]+$ | 14 / 20 | sûr |
| Stack Overflow — réponse à 3 votes, exige un préfixe littéral « ISBN: », rejette tout ISBN saisi seul | ^ISBN:(\d{9}(?:\d|X))$ | 11 / 20 | sûr |
Implémentation
const re = new RegExp("^(?:\\d{9}[0-9Xx]|(?:978|979)\\d{10})$", "");
re.test(input);Limites
- Ne vérifie ni la clé de contrôle de l'ISBN-10 (somme pondérée modulo 11) ni celle de l'ISBN-13 (somme pondérée modulo 10) : un numéro syntaxiquement valide selon ce motif peut avoir un chiffre de contrôle incorrect et ne correspondre à aucun livre réellement catalogué.
- Exige une chaîne de chiffres consécutifs sans tiret ni espace : les tirets couramment utilisés dans l'affichage (« 978-1-4919-0399-6 ») doivent être retirés avant validation.
- N'extrait pas un ISBN à l'intérieur d'un texte plus long (« ISBN:9780113411436 » ou une phrase) : la chaîne entière doit être l'ISBN lui-même, sans préfixe ni texte environnant.
- Les préfixes Bookland/EAN 978 et 979 sont les deux seuls attribués à ce jour pour les ISBN-13 : si l'Agence internationale de l'ISBN venait à en ouvrir un troisième face à l'épuisement des deux premiers, ce motif devrait être mis à jour.