Regex ISBN (ISBN-10 or ISBN-13)
The reference Stack Overflow question starts from a real bug: an unanchored ISBN-10 test ("\d{9}(?:\d|X)") wrongly recognizes the first 10 digits of any ISBN-13, because it's a plain substring search. A widely copied tutorial (GeeksforGeeks) has a subtler flaw: its own test example validates "1207199818865" as a correct ISBN-13, even though a real ISBN-13 must start with 978 or 979 (the Bookland/EAN prefix assigned to books) - their pattern only checks length, not the prefix. Here's a pattern that correctly tells the two formats apart, compared against both of those attempts and a third that's far too restrictive.
/^(?:\d{9}[0-9Xx]|(?:978|979)\d{10})$/passes 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
const re = new RegExp("^(?:\\d{9}[0-9Xx]|(?:978|979)\\d{10})$", "");
re.test(input);Limits
- 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.