Regex Portuguese licence plate
Portugal has had four plate formats: AA-00-00 (until 1992), 00-00-AA, 00-AA-00 and, since March 2020, AA-00-AA, printed without hyphens. A typo in validator.js, a 23,000-star library, turned a character list into a range: '[ -·]' runs from the space to the middle dot and contains digits, uppercase letters, '!' and '@'. Tested result on version 13.15.35: 'AB51234' and '12!AB@34' are accepted as Portuguese plates. The two other real attempts are stuck in one era: one only knows AA-00-AA, the other only the three old hyphenated formats. Here's a pattern covering all four formats, compared against those three real attempts.
/^(?:[A-Z]{2}([- ]?)[0-9]{2}\1[0-9]{2}|[0-9]{2}([- ]?)[A-Z]{2}\2[0-9]{2}|[0-9]{2}([- ]?)[0-9]{2}\3[A-Z]{2}|[A-Z]{2}([- ]?)[0-9]{2}\4[A-Z]{2})$/passes 26/26 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| validator.js (pt-PT, 23 000 étoiles) — « [ -·] » est une plage (de l'espace au point médian) qui contient chiffres, lettres et symboles : « AB51234 » et « 12!AB@34 » passent (testé en 13.15.35) ; majuscules seulement | ^(([A-Z]{2}[ -·]?[0-9]{2}[ -·]?[0-9]{2})|([0-9]{2}[ -·]?[A-Z]{2}[ -·]?[0-9]{2})|([0-9]{2}[ -·]?[0-9]{2}[ -·]?[A-Z]{2})|([A-Z]{2}[ -·]?[0-9]{2}[ -·]?[A-Z]{2}))$ | 23 / 26 | safe |
| eu-licence-validator (Go, WASM) — ne connaît que AA-00-AA : rejette AB-12-34, 12-34-AB et 12-AB-34, les plaques plus anciennes encore en circulation | ^([A-Z]{2})[-\s]?(\d{2})[-\s]?([A-Z]{2})$ | 20 / 26 | safe |
| CodeCornTech (euro-plate-validator, trois regex réunies par |) — seulement les trois anciens formats, avec tirets obligatoires : rejette AB-12-CD et « AB12CD », la plaque actuelle imprimée sans tirets | ^(?:\d{2}-[A-Z]{2}-\d{2}|[A-Z]{2}-\d{2}-\d{2}|\d{2}-\d{2}-[A-Z]{2})$ | 20 / 26 | safe |
Implementation
const re = new RegExp("^(?:[A-Z]{2}([- ]?)[0-9]{2}\\1[0-9]{2}|[0-9]{2}([- ]?)[A-Z]{2}\\2[0-9]{2}|[0-9]{2}([- ]?)[0-9]{2}\\3[A-Z]{2}|[A-Z]{2}([- ]?)[0-9]{2}\\4[A-Z]{2})$", "");
re.test(input);Limits
- Valide seulement la FORME (quatre dispositions de deux lettres et de quatre chiffres) : ne vérifie pas que la plaque est attribuée par l'IMT, ni la cohérence de l'époque (« 99-ZZ-99 » est la dernière plaque de la série 00-AA-00 d'après Wikipédia). Les lettres de chaque disposition ne sont pas bornées : « KW », « YZ » (K, W et Y n'étaient pas utilisées avant 2020) passent.
- Le motif accepte le séparateur tiret, espace ou aucun, mais le même partout dans une plaque : « AB-12 CD » (séparateurs mélangés) est rejeté. Les plaques AA-00-AA sont imprimées sans tirets d'après Wikipédia : normalisez-les avant stockage.
- Les dates des formats viennent en partie de Wikipédia (source de dernier recours) : la page de l'IMT consultée ne les cite pas toutes. Les formats spéciaux (plaques d'historique, de remorque, de diplomate) ne sont pas couverts.
- Majuscules ASCII seulement : « ab-12-cd » est rejeté. Normalisez la casse avant validation si vos utilisateurs saisissent en minuscules.