Regex German licence plate
A German plate is written B-AB 1234: a 1-to-3-letter district code, 1 or 2 series letters, a number from 1 to 9999 with no leading zero, and an optional E (electric) or H (historic) suffix. Annex 4 of the FZV also caps the plate at 8 characters in total. The validator.js library, with its 2.6 kB district list, nonetheless accepts 'B-AB 0' and 'B-AB 0123' (tested). The other real attempts do not know the 8-character limit: 'MÜN-AB 1234' has 9. Here's a pattern following the FZV, compared against those three real attempts.
/^(?![A-ZÄÖÜ]{3}-[A-Z]{2} [0-9]{4})[A-ZÄÖÜ]{1,3}-[A-Z]{1,2} [1-9][0-9]{0,3}[EH]?$/passes 24/24 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| eu-licence-validator (Go, WASM) — « d{1,4} » accepte 0 et les zéros initiaux (« B-AB 0123 ») ; séparateurs facultatifs (« B-AB123 », « B AB 123 » passent) ; pas de limite de 8 caractères ; minuscules rejetées | ^([A-Z]{1,3})[s-]?([A-Z]{1,2})[s-]?(d{1,4})([EH]?)$ | 15 / 24 | safe |
| kennzeichen (npm) — la plus proche de la FZV (chiffre initial 1-9, suffixe E/H) mais drapeau i : « b-ab 123 » passe ; pas de limite de 8 caractères ; « MÜN-AB 1234 » et un district inventé passent | ^[A-ZÄÖÜ]{1,3}-[A-Z]{1,2} [1-9][0-9]{0,3}[EH]?$ | 22 / 24 | safe |
| CodeCornTech (euro-plate-validator) — pas de suffixe E/H (« K-AB 12E » rejeté) ; « B-AB 0123 » accepté ; pas de limite de 8 caractères | ^[A-ZÄÖÜ]{1,3}-[A-Z]{1,2}\s?\d{1,4}$ | 18 / 24 | safe |
Implementation
const re = new RegExp("^(?![A-ZÄÖÜ]{3}-[A-Z]{2} [0-9]{4})[A-ZÄÖÜ]{1,3}-[A-Z]{1,2} [1-9][0-9]{0,3}[EH]?$", "");
re.test(input);Limits
- Valide seulement la FORME : ne connaît pas la liste officielle des codes de district (KBA) : « XXX-AB 12 » a la bonne forme sans que « XXX » existe. Une table de districts doit être ajoutée si vous devez distinguer les codes attribués.
- Applique la limite de 8 caractères de l'annexe 4 de la FZV pour les districts à 3 lettres avec 2 lettres de série et 4 chiffres (9 caractères), mais l'ambiguïté du décompte du suffixe E ou H n'a pas été tranchée par la source consultée.
- La regex de validator.js (de-DE), de 2546 caractères, dépasse la limite de 2000 caractères du moteur de ce site et n'est donc pas dans le tableau : comme elle accepte « B-AB 0 », « B-AB 0123 » et « B-AB 12 E » (testé en 13.15.35), elle est citée ici plutôt que scorée. Les combinaisons exclues en pratique (SS, NS, HJ, KZ, SA…) ne figurent pas dans la loi, qui parle seulement de « guten Sitten » : elles dépendent de pratiques administratives locales et ne sont pas filtrées.
- Exige le tiret et l'espace de la plaque officielle, en majuscules : « B AB 123 » et « B-AB123 » sont rejetés. Les plaques spéciales (diplomatiques, saisonnières, Zoll…) ne sont pas couvertes.