Rexact
Cheatsheet

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

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.

Pages liées