Rexact
Cheatsheet

Regex Belgian VAT number (BE + 10 digits)

The Belgian VAT number, identical to the enterprise number, is written 'BE' followed by 10 digits whose first is '0' or '1': the Commission's VIES FAQ lists it as 'BE0999999999 / BE1999999999' and states that the 10-digit format results from adding a leading zero to the old 9-digit format. The last two digits are a check: 97 minus the remainder of the first 8 digits divided by 97. Among the attempts read, validator.js accepts a first digit from 2 to 9, jsvat accepts the old 9-digit format and rejects numbers starting with 1, and the Regular Expressions Cookbook's regex rejects those too. Here's a strict 10-digit pattern, compared against those attempts.

/^BE[01][0-9]{9}$/
passes 23/23 cases

Comparison of existing patterns

SourcepatternScore on the corpusReDoS
validator.js (isVAT) — préfixe « BE » facultatif (« 0428759497 » nu passe) ; premier chiffre libre : « BE2428759497 » et « BE9428759497 » passent^(BE)?\d{10}$20 / 23safe
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 / 23safe
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 / 23safe
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 / 23safe

Implementation

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

Limits

  • 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.

Related pages