Regular Expressions — Cheatsheet
Johan Beysen
Wat zijn Regular Expressions?
Een regular expression (regex) is een patroon dat beschrijft wat een string mag bevatten. Je gebruikt het om tekst te zoeken, valideren of vervangen.
Dat patroon matcht een e-mailadres. Elk teken heeft een betekenis — dit document legt ze uit.
Testen
Gebruik regex101.com om patronen interactief te testen met uitleg per token.
Anchors
Anchors matchen een positie, geen teken.
| Patroon | Betekenis | Voorbeeld match |
|---|---|---|
^ |
Begin van de string | ^hallo matcht hallo wereld |
$ |
Einde van de string | wereld$ matcht hallo wereld |
\b |
Woordgrens | \bcat\b matcht cat maar niet catch |
\B |
Geen woordgrens | \Bcat\B matcht concatenate |
Character Classes
| Patroon | Betekenis |
|---|---|
. |
Elk teken behalve newline |
\d |
Cijfer — [0-9] |
\D |
Geen cijfer — [^0-9] |
\w |
Woordteken — [a-zA-Z0-9_] |
\W |
Geen woordteken |
\s |
Whitespace — spatie, tab, newline |
\S |
Geen whitespace |
\n |
Newline |
\t |
Tab |
Eigen klassen met [ ]
[aeiou] — één van de tekens a, e, i, o, u
[a-z] — kleine letter a tot z
[A-Z] — hoofdletter A tot Z
[0-9] — cijfer 0 tot 9
[a-zA-Z0-9] — letter of cijfer
[^aeiou] — alles behalve een klinker (^ = negatie binnen [ ])
[a-z&&[^aeiou]] — consonant (Java-syntax)
Quantifiers
Quantifiers bepalen hoe vaak het vorige element mag voorkomen.
| Patroon | Betekenis | Greedy? |
|---|---|---|
* |
0 of meer keer | Ja |
+ |
1 of meer keer | Ja |
? |
0 of 1 keer (optioneel) | Ja |
{n} |
Exact n keer | Ja |
{n,} |
Minstens n keer | Ja |
{n,m} |
Tussen n en m keer | Ja |
*? |
0 of meer — lazy | Nee |
+? |
1 of meer — lazy | Nee |
?? |
0 of 1 — lazy | Nee |
Greedy vs Lazy
Greedy (standaard): pakt zo veel mogelijk tekens.
Lazy (met ?): pakt zo weinig mogelijk tekens.
Groepen & Referenties
| Patroon | Betekenis |
|---|---|
(abc) |
Capture group — onthoudt de match |
(?:abc) |
Non-capturing group — groepeert zonder op te slaan |
(?P<naam>abc) |
Named capture group (Python/PCRE) |
(?<naam>abc) |
Named capture group (JS/.NET) |
\1 |
Backreference naar groep 1 |
\k<naam> |
Backreference naar named group |
a\|b |
Alternatie — a of b |
(https?):\/\/ — capture group 1 = "http" of "https"
(?:https?):\/\/ — zelfde match, maar niet opgeslagen
(\w+)\s\1 — matcht een herhaald woord: "hello hello"
Lookahead & Lookbehind
Matchen op basis van wat voor of na de positie staat — zonder die context op te nemen in de match.
| Patroon | Type | Betekenis |
|---|---|---|
(?=abc) |
Positive lookahead | gevolgd door abc |
(?!abc) |
Negative lookahead | niet gevolgd door abc |
(?<=abc) |
Positive lookbehind | voorafgegaan door abc |
(?<!abc) |
Negative lookbehind | niet voorafgegaan door abc |
\d+(?= euro) — matcht getal alleen als er " euro" achter staat
\d+(?! euro) — matcht getal als er GEEN " euro" achter staat
(?<=€)\d+ — matcht getal alleen als er "€" voor staat
(?<!€)\d+ — matcht getal als er GEEN "€" voor staat
Flags / Modifiers
Flags wijzigen het gedrag van de hele regex.
| Flag | Betekenis |
|---|---|
i |
Case-insensitive |
g |
Global — alle matches, niet enkel de eerste |
m |
Multiline — ^ en $ matchen per lijn |
s |
Dotall — . matcht ook newlines |
x |
Extended — whitespace en comments toegestaan |
Speciale Tekens Escapen
Deze tekens hebben een speciale betekenis en moeten ge-escaped worden met \ als je ze letterlijk bedoelt:
3\.14 — matcht letterlijk "3.14" (niet "3X14")
\(groep\) — matcht letterlijk "(groep)"
C\+\+ — matcht letterlijk "C++"
Veelgebruikte Patronen
Validatie
E-mail: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
IPv4: ^(\d{1,3}\.){3}\d{1,3}$
IPv6 (simpel): ^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
URL: https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b
Datum (ISO): ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
Tijd (HH:MM): ^([01]\d|2[0-3]):[0-5]\d$
Postcode (BE): ^[1-9]\d{3}$
IBAN (BE): ^BE\d{2}\d{12}$
BTW (BE): ^BE0\d{9}$
Wachtwoordsterkte
Minstens 8 tekens: ^.{8,}$
Minstens 1 hoofdletter: ^(?=.*[A-Z])
Minstens 1 kleine letter: ^(?=.*[a-z])
Minstens 1 cijfer: ^(?=.*\d)
Minstens 1 speciaal teken: ^(?=.*[!@#$%^&*])
Alles samen (8+, upper, lower, cijfer): ^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$
Tekst manipulatie
Witruimte trimmen (begin/einde): ^\s+|\s+$
Meerdere spaties samenvoegen: \s{2,}
Lege regels verwijderen: ^$\n
HTML-tags verwijderen: <[^>]+>
Kommentaar (// ...): \/\/.*$
Kommentaar (/* ... */): \/\*[\s\S]*?\*\/
Netwerk & Security
MAC-adres: ([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}
Private IP (RFC 1918): ^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)
Base64: ^[A-Za-z0-9+/]+={0,2}$
JWT (3 delen): ^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$
Hash MD5: ^[a-f0-9]{32}$
Hash SHA1: ^[a-f0-9]{40}$
Hash SHA256: ^[a-f0-9]{64}$
Tool-specifieke Syntax
grep / egrep
grep 'patroon' bestand # BRE — basic regex
grep -E 'patroon' bestand # ERE — extended (+ ? | () zonder \)
grep -P 'patroon' bestand # PCRE — Perl-compatible
grep -o '\b[A-Z]{2,}\b' bestand # toon enkel de match
grep -n 'patroon' bestand # toon regelnummers
grep -r 'patroon' map/ # recursief
grep -v 'patroon' bestand # regels ZONDER match
sed
sed 's/oud/nieuw/' # vervang eerste match per lijn
sed 's/oud/nieuw/g' # vervang alle matches
sed 's/oud/nieuw/gi' # case-insensitive + global
sed -n '/patroon/p' # toon enkel matchende regels
sed '/patroon/d' # verwijder matchende regels
sed 's/\(groep\)/[\1]/' # backreference in BRE
sed -E 's/(groep)/[\1]/' # backreference in ERE
Python
import re
re.match(r'patroon', tekst) # match enkel aan het begin
re.search(r'patroon', tekst) # match overal
re.findall(r'patroon', tekst) # lijst van alle matches
re.sub(r'oud', 'nieuw', tekst) # vervangen
re.split(r'\s+', tekst) # splitsen
m = re.search(r'(\d+)-(\d+)', tekst)
m.group(0) # volledige match
m.group(1) # eerste groep
m.groups() # tuple van alle groepen
JavaScript
const re = /patroon/flags;
'tekst'.match(/patroon/g) // alle matches
'tekst'.replace(/oud/g, 'nieuw') // vervangen
'tekst'.split(/\s+/) // splitsen
/patroon/.test('tekst') // true/false
const m = 'tekst'.match(/(\w+)/);
m[0] // volledige match
m[1] // eerste groep
BRE vs ERE vs PCRE
| Functie | BRE (grep) |
ERE (grep -E) |
PCRE (grep -P) |
|---|---|---|---|
| Groepen | \(\) |
() |
() |
| Alternatie | \| |
\| |
\| |
+ quantifier |
\+ |
+ |
+ |
? quantifier |
\? |
? |
? |
| Lookahead | ✗ | ✗ | (?=...) |
| Lookbehind | ✗ | ✗ | (?<=...) |
| Named groups | ✗ | ✗ | (?P<naam>...) |
\d \w \s |
✗ | ✗ | ✓ |