Regex uitgelegd
Er zijn meestal twee soorten regex voor UUID's: een ruime variant die alleen naar lengte en tekensoort kijkt, en een strenge variant die ook het versienummer op de dertiende positie en het variantnummer op de zeventiende controleert.
De ruime variant gebruik je om iets dat op een UUID lijkt in een logboek te vinden, de strenge variant om te bepalen of een waarde echt bruikbaar is. Deze tool toont beide resultaten naast elkaar.
Hoe het werkt
- Plak de waarden die je wilt testen, één per regel en maximaal 200.
- Klik op Regex testen.
- Per regel zie je aan welke variant de waarde voldoet.
- Alleen wat de strenge variant haalt, is een echt geldige UUID.
Waarvoor je het gebruikt
- Een regex testen voordat je hem in een logparser zet.
- Waarden aan de clientkant tegenhouden voordat je ze aanneemt.
- UUID-kolommen opsporen in een datapijplijn of BI-query.
Structuur
De strenge variant staat op de dertiende positie alleen 1 tot en met 8 toe en op de zeventiende alleen 8, 9, a of b. Die twee posities geven de versie en de variant van de UUID aan.
Waar Regex past
| Optie | Wanneer gebruiken |
|---|---|
Regex | Als je het patroon zelf wilt nakijken |
Controleren | Als je alleen de waarde wilt beoordelen zonder het patroon |
Bulk | Als je veel waarden wilt maken om te testen |
Overzicht van alle UUID-versies
| Versie | Sorteerbaar | Herkomst van de bits | Waarvoor het past |
|---|---|---|---|
| v1 | Nee | Tijdstempel + MAC-adres | Bestaande systemen die v1 verwachten |
| v3 | Nee | MD5-hash van de naam | Deterministische ID's als MD5 verplicht is |
| v4 | Nee | 122 random bits | Vrijwel elke gewone unieke identificatie |
| v5 | Nee | SHA-1-hash van de naam | Als dezelfde naam altijd dezelfde ID moet geven |
| v6 | Ja | Herschikte tijdstempel | Als je zowel randomheid als sortering wilt |
| v7 | Ja | Unix-tijd in milliseconden | Primaire sleutels en gebeurtenis-ID's |
| v8 | Nee | Zelfgekozen bitindeling | Eigen formaten en experimenten |
Alle zeven versies zijn 128 bits en gebruiken dezelfde notatie 8-4-4-4-12. Het verschil zit alleen in wat elk bit voorstelt.
Codevoorbeelden
javascript
// Ruim: alleen het formaat
const loose = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
// Streng: ook versie en variant
const strict = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
python
import re
STRICT = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}'
r'-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', re.I)
bool(STRICT.match(value))
java
var strict = Pattern.compile(
"^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-"
+ "[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
Pattern.CASE_INSENSITIVE);
csharp
var strict = new Regex(
"^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-"
+ "[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
RegexOptions.IgnoreCase);
sql
-- PostgreSQL 13+
WHERE value ~* '^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$';
Veelgestelde vragen
Wat is het verschil tussen de ruime en de strenge variant?
De ruime variant kijkt alleen naar lengte en tekensoort, de strenge variant controleert ook de versie- en variantposities. Wil je waarden wegfilteren waarvan het formaat klopt maar de versie niet bestaat, dan heb je de strenge variant nodig.
Waarom loopt het versienummer van 1 tot 8?
Omdat RFC 9562 de versies 1 tot en met 8 definieert. Nul wordt niet gebruikt en 9 en hoger zijn gereserveerd.
Waarom zijn de varianttekens 8, 9, a en b?
Omdat de eerste twee bits van de RFC 4122 / 9562-variant 10 zijn. In hexadecimale notatie levert dat 8 tot en met b op.