Rexact
Cheatsheet

Regex numéro de TVA belge (BE + 10 chiffres)

Le numéro de TVA belge, identique au numéro d'entreprise, s'écrit « BE » suivi de 10 chiffres, dont le premier est « 0 » ou « 1 » : la FAQ VIES de la Commission le note « BE0999999999 / BE1999999999 » et précise que le format à 10 chiffres résulte de l'ajout d'un zéro devant l'ancien format à 9 chiffres. Les deux derniers chiffres sont une clé : 97 moins le reste de la division par 97 des 8 premiers chiffres. Parmi les tentatives relues, validator.js accepte un premier chiffre de 2 à 9, jsvat accepte l'ancien format à 9 chiffres et refuse les numéros qui commencent par 1, et la regex du Regular Expressions Cookbook refuse aussi ces derniers. Voici un motif strict à 10 chiffres, comparé à ces tentatives.

/^BE[01][0-9]{9}$/
passe 23/23 cas

Comparatif des patterns existants

SourcepatternScore sur le corpusReDoS
validator.js (isVAT) — préfixe « BE » facultatif (« 0428759497 » nu passe) ; premier chiffre libre : « BE2428759497 » et « BE9428759497 » passent^(BE)?\d{10}$20 / 23sûr
jsvat (belgium.ts) — « 0?d{9} » accepte l'ancien format à 9 chiffres (« BE428759497 ») mais refuse les numéros qui commencent par 1 (« BE1234567894 ») ; la clé est contrôlée à part par calcFn^(BE)(0?\d{9})$18 / 23sûr
valvat (syntax.rb, A et Z remplacés par ^ et $) — ancrée, préfixe obligatoire, premier chiffre 0 ou 1 : accepte exactement les mêmes chaînes que la recommandée^BE[0-1][0-9]{9}$23 / 23sûr
Regular Expressions Cookbook, recette 4.21 (27 pays en une regex, insensible à la casse) — branche belge « (BE)?0[0-9]{9} » : refuse les numéros commençant par 1, préfixe facultatif, minuscules acceptées^((AT)?U[0-9]{8}|(BE)?0[0-9]{9}|(BG)?[0-9]{9,10}|(CY)?[0-9]{8}L|(CZ)?[0-9]{8,10}|(DE)?[0-9]{9}|(DK)?[0-9]{8}|(EE)?[0-9]{9}|(EL|GR)?[0-9]{9}|(ES)?[0-9A-Z][0-9]{7}[0-9A-Z]|(FI)?[0-9]{8}|(FR)?[0-9A-Z]{2}[0-9]{9}|(GB)?([0-9]{9}([0-9]{3})?|[A-Z]{2}[0-9]{3})|(HU)?[0-9]{8}|(IE)?[0-9]S[0-9]{5}L|(IT)?[0-9]{11}|(LT)?([0-9]{9}|[0-9]{12})|(LU)?[0-9]{8}|(LV)?[0-9]{11}|(MT)?[0-9]{8}|(NL)?[0-9]{9}B[0-9]{2}|(PL)?[0-9]{10}|(PT)?[0-9]{9}|(RO)?[0-9]{2,10}|(SE)?[0-9]{12}|(SI)?[0-9]{8}|(SK)?[0-9]{10})$16 / 23sûr

Implémentation

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

Limites

  • Valide seulement la FORME : « BE0431150351 » a la bonne structure mais une clé fausse et passe ce motif. La clé modulo 97 n'est pas recalculée par la regex.
  • Le motif refuse l'ancien format à 9 chiffres (« BE428759497 ») : la FAQ de la Commission indique que le format à 10 chiffres est l'ancien format précédé d'un zéro. Normalisez en ajoutant un « 0 » si vos données anciennes en contiennent.
  • La séparation habituelle en BE 0428.759.497 (points) n'est pas acceptée : supprimez les séparateurs avant validation. Aucune vérification d'existence (VIES, Banque-Carrefour des Entreprises).
  • Les numéros du corpus sont des exemples de documentation ou synthétiques ; n'utilisez pas de vrais numéros d'entreprise dans vos tests.

Pages liées