Regex Tester
Reguläre Ausdrücke gegen einen String testen und alle Treffer farbig hervorgehoben sehen
Pattern
Teststring
Was ist ein regulärer Ausdruck?
Ein regulärer Ausdruck (Regex oder Regexp) ist eine Zeichenfolge, die ein Suchmuster definiert. Regex-Tester ermöglichen es, ein Pattern zu schreiben, es gegen Beispieltext auszuführen und alle Treffer in Echtzeit farbig hervorgehoben zu sehen. Das Konzept geht auf die Arbeit des Mathematikers Stephen Kleene zu regulären Sprachen in den 1950er-Jahren zurück; Ken Thompson baute 1968 die erste Regex-Engine in den QED-Texteditor ein.
Eine Regex-Engine liest ein Pattern von links nach rechts und verbraucht dabei Eingabezeichen. Bei einem Teilmisserfolg verwendet sie Backtracking: Die Engine geht zurück und versucht alternative Wege durch das Pattern. Einige Engines (wie RE2 in Go) vermeiden Backtracking vollständig, indem sie Patterns in deterministische endliche Automaten (DFA) umwandeln. Das garantiert lineare Laufzeit, verzichtet aber auf Features wie Rückwärtsreferenzen.
Regex-Syntax ist nur locker standardisiert. PCRE (Perl Compatible Regular Expressions) ist das verbreitetste Format, unterstützt von PHP, Pythons re-Modul und JavaScript mit geringfügigen Unterschieden. POSIX definiert eine eingeschränktere Syntax, die von grep und sed verwendet wird. Diese Unterschiede sind relevant beim Portieren von Patterns zwischen Sprachen: Ein Lookahead, der in JavaScript funktioniert, lässt sich in Gos RE2-Engine möglicherweise gar nicht kompilieren.
Warum einen Online-Regex-Tester verwenden?
Regex in einer Code-Datei zu schreiben bedeutet, nach jeder Anpassung zu speichern, auszuführen und die Ausgabe zu prüfen. Ein browserbasierter Regex-Tester schließt diese Feedback-Schleife auf null: Man tippt und sieht sofort die Treffer.
Anwendungsfälle für den Regex Tester
Regex-Syntax-Kurzreferenz
Die folgende Tabelle zeigt die gebräuchlichsten Regex-Token. Sie funktionieren in JavaScript, Python, Go, PHP und den meisten PCRE-kompatiblen Engines. Sprachspezifische Erweiterungen (wie Pythons konditionale Patterns oder JavaScripts Named Groups mit \k-Syntax) sind im Abschnitt Code-Beispiele erläutert.
| Pattern | Name | Beschreibung |
|---|---|---|
| . | 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-Flags erklärt
Flags (auch Modifier genannt) ändern, wie die Engine das Pattern verarbeitet. In JavaScript werden sie nach dem schließenden Schrägstrich angehängt: /pattern/gi. In Python werden sie als zweites Argument übergeben: re.findall(pattern, text, re.IGNORECASE | re.MULTILINE). Nicht alle Flags sind in jeder Sprache verfügbar.
| Flag | Name | Verhalten |
|---|---|---|
| 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 |
Code-Beispiele
Funktionierende Regex-Beispiele in JavaScript, Python, Go und auf der Kommandozeile. Jedes Beispiel zeigt Pattern-Konstruktion, Match-Extraktion und Ausgabe.
// 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