Rexact
Cheatsheet

Regex GTIN-14 (ITF-14)

A GTIN-14 is fourteen digits: an indicator digit (1 to 8 for a packaging level, 9 for a variable-measure item — weight, length) followed by a GTIN-13/EAN-13 without its own check digit, the whole thing recomputed with the same GS1 check digit (alternating 1/3 weights, modulo 10) as EAN-13 and GLN (see related pages). An EAN-13 padded with a leading non-significant zero becomes a GTIN-14 whose check digit stays - by construction, a leading zero changes no weighting - strictly identical to the original EAN-13's; that only holds for indicator digit 0, any other indicator digit forces a recomputation over all thirteen digits. "GTIN" isn't a length, it's a family (GTIN-8, -12, -13, -14): a pattern that accepts the whole family, or that confuses 13 and 14 digits, silently validates the wrong format.

/^[0-9]{14}$/
passes 22/22 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^[0-9]{14}$", "");
re.test(input);

Limits

  • Ne vérifie pas la clé de contrôle GS1 (pondération alternée 1/3, modulo 10) : un code syntaxiquement valide selon ce motif peut avoir une clé fausse, ou être quatorze zéros — aucun des deux ne correspond à un article réel.
  • N'accepte que des chiffres consécutifs sans séparateur : les exports contenant des espaces ou des tirets (fréquents en logistique et en export tableur) doivent être normalisés avant validation.
  • La famille GTIN comprend plusieurs longueurs valides (GTIN-8, -12, -13, -14) ; ce motif n'en couvre qu'une. Un motif qui accepte la famille entière (voir candidat 2) ou qui confond 13 et 14 chiffres (voir candidat 3) valide silencieusement le mauvais format — si le besoin réel est « accepter n'importe quel GTIN », il faut un motif conscient de la famille, pas ce motif-ci répété par longueur.
  • Le chiffre indicateur en tête (1 chiffre) n'est vérifié que pour la longueur : ce motif accepte n'importe quelle valeur 0-9, y compris 0 combiné à un article à quantité variable, une combinaison que GS1 ne définit pas.
  • Écrit avec `[0-9]` et non `\d` : en Python et .NET, `\d` matche par défaut tous les chiffres décimaux Unicode (pas seulement 0-9), et son comportement dépend d'une option de compilation en Java.

Related pages