Rexact
Cheatsheet

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

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.

Related pages