Regex Tester
Test reguliere expressies op een tekenreeks en markeer alle overeenkomsten
Patroon
Testreeks
Wat is een reguliere expressie?
Een reguliere expressie (regex of regexp) is een reeks tekens die een zoekpatroon definieert. Met een regex tester schrijf je een patroon, pas je het toe op voorbeeldtekst en zie je alle overeenkomsten direct gemarkeerd. Het concept gaat terug op het werk van wiskundige Stephen Kleene over reguliere talen in de jaren vijftig. Ken Thompson bouwde in 1968 de eerste regex-engine in de QED-teksteditor.
Een regex-engine leest een patroon van links naar rechts en verbruikt invoertekens terwijl hij probeert te matchen. Bij een gedeeltelijke mismatch gebruikt hij backtracking: de engine stapt terug en probeert alternatieve paden door het patroon. Sommige engines (zoals RE2 in Go) vermijden backtracking volledig door patronen om te zetten naar deterministische eindige automaten (DFA), wat lineaire matching garandeert ten koste van functies zoals back-references.
Regex-syntaxis is losjes gestandaardiseerd. PCRE (Perl Compatible Regular Expressions) is de meestgebruikte variant, ondersteund door PHP, de Python re-module en JavaScript met kleine verschillen. POSIX definieert een beperkter syntax die door grep en sed wordt gebruikt. Deze verschillen zijn van belang bij het overzetten van patronen tussen talen: een lookahead die werkt in JavaScript compileert mogelijk helemaal niet in Go's RE2-engine.
Waarom een online regex tester gebruiken?
Regex debuggen in een codebestand betekent steeds opslaan, uitvoeren en de uitvoer inspecteren. Een browsergebaseerde regex tester sluit die feedbacklus tot nul: je typt en je ziet de overeenkomsten direct.
Toepassingen van de Regex Tester
Beknopte regex-syntaxreferentie
De onderstaande tabel behandelt de meestgebruikte regex-tokens. Deze werken in JavaScript, Python, Go, PHP en de meeste PCRE-compatibele engines. Taalspecifieke uitbreidingen (zoals Pythons conditionele patronen of JavaScript's named groups met \k-syntaxis) worden vermeld in de sectie met codevoorbeelden.
| Patroon | Naam | Beschrijving |
|---|---|---|
| . | Any character | Matches any single character except newline (unless s flag is set) |
| \d | Digit | Matches [0-9] |
| \w | Word character | Matches [a-zA-Z0-9_] |
| \s | Whitespace | Matches space, tab, newline, carriage return, form feed |
| \b | Word boundary | Matches the position between a word character and a non-word character |
| ^ | Start of string/line | Matches the start of the input; with m flag, matches start of each line |
| $ | End of string/line | Matches the end of the input; with m flag, matches end of each line |
| * | Zero or more | Matches the preceding token 0 or more times (greedy) |
| + | One or more | Matches the preceding token 1 or more times (greedy) |
| ? | Optional | Matches the preceding token 0 or 1 time |
| {n,m} | Quantifier range | Matches the preceding token between n and m times |
| () | Capturing group | Groups tokens and captures the matched text for back-references |
| (?:) | Non-capturing group | Groups tokens without capturing the matched text |
| (?=) | Positive lookahead | Matches a position followed by the given pattern, without consuming it |
| (?<=) | Positive lookbehind | Matches a position preceded by the given pattern, without consuming it |
| [abc] | Character class | Matches any one of the characters inside the brackets |
| [^abc] | Negated class | Matches any character not inside the brackets |
| | | Alternation | Matches the expression before or after the pipe |
Regex-vlaggen uitgelegd
Vlaggen (ook wel modifiers genoemd) bepalen hoe de engine het patroon verwerkt. In JavaScript voeg je ze toe na de sluitende slash: /patroon/gi. In Python geef je ze mee als tweede argument: re.findall(patroon, tekst, re.IGNORECASE | re.MULTILINE). Niet alle vlaggen zijn in elke taal beschikbaar.
| Vlag | Naam | Gedrag |
|---|---|---|
| g | Global | Find all matches, not just the first one |
| i | Case-insensitive | Letters match both uppercase and lowercase |
| m | Multiline | ^ and $ match start/end of each line, not just the whole string |
| s | Dot-all | . matches newline characters as well |
| u | Unicode | Treat the pattern and subject as a Unicode string; enables \u{FFFF} syntax |
| y | Sticky | Matches only from the lastIndex position in the target string |
Codevoorbeelden
Werkende regex-voorbeelden in JavaScript, Python, Go en de commandoregel. Elk voorbeeld toont patroonopbouw, extractie van overeenkomsten en uitvoer.
// Match all email addresses in a string
const text = 'Contact us at support@example.com or sales@example.com'
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g
const matches = text.matchAll(emailRegex)
for (const match of matches) {
console.log(match[0], 'at index', match.index)
}
// → "support@example.com" at index 14
// → "sales@example.com" at index 37
// Named capture groups (ES2018+)
const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
const result = '2026-03-30'.match(dateRegex)
console.log(result.groups)
// → { year: "2026", month: "03", day: "30" }
// Replace with a callback
'hello world'.replace(/\b\w/g, c => c.toUpperCase())
// → "Hello World"import re
# Find all IPv4 addresses
text = 'Server 192.168.1.1 responded, fallback to 10.0.0.255'
pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'
matches = re.findall(pattern, text)
print(matches) # → ['192.168.1.1', '10.0.0.255']
# Named groups and match objects
date_pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m = re.search(date_pattern, 'Released on 2026-03-30')
if m:
print(m.group('year')) # → '2026'
print(m.group('month')) # → '03'
# Compile for repeated use (faster in loops)
compiled = re.compile(r'\b[A-Z][a-z]+\b')
words = compiled.findall('Hello World Foo bar')
print(words) # → ['Hello', 'World', 'Foo']package main
import (
"fmt"
"regexp"
)
func main() {
// Find all matches
re := regexp.MustCompile(`\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b`)
text := "Contact support@example.com or sales@example.com"
matches := re.FindAllString(text, -1)
fmt.Println(matches)
// → [support@example.com sales@example.com]
// Named capture groups
dateRe := regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})`)
match := dateRe.FindStringSubmatch("2026-03-30")
for i, name := range dateRe.SubexpNames() {
if name != "" {
fmt.Printf("%s: %s\n", name, match[i])
}
}
// → year: 2026
// → month: 03
// → day: 30
// Replace with a function
result := re.ReplaceAllStringFunc(text, func(s string) string {
return "[REDACTED]"
})
fmt.Println(result)
// → Contact [REDACTED] or [REDACTED]
}# Find lines matching an IP address pattern
grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' access.log
# Extract email addresses from a file
grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' contacts.txt
# Replace dates from YYYY-MM-DD to DD/MM/YYYY using sed
echo "2026-03-30" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
# → 30/03/2026
# Count matches per file in a directory
grep -rcE 'TODO|FIXME|HACK' src/
# → src/main.js:3
# → src/utils.js:1