Regex Tester
Testujte regulární výrazy oproti řetězci a zobrazte všechny zvýrazněné shody
Vzor
Testovací řetězec
Co je regulární výraz?
Regulární výraz (regex nebo regexp) je posloupnost znaků definující vzor vyhledávání. Nástroje pro testování regex vám umožňují napsat vzor, spustit ho proti ukázkovému textu a zobrazit všechny shody zvýrazněné v reálném čase. Koncept sahá k práci matematika Stephena Kleeneho o regulárních jazycích v 50. letech; Ken Thompson zabudoval první regex engine do textového editoru QED v roce 1968.
Regex engine čte vzor zleva doprava a spotřebovává vstupní znaky při pokusu o shodu. Při selhání částečné shody používá zpětné navracení (backtracking): engine se vrátí a zkusí alternativní cesty vzorem. Některé enginy (například RE2 používaný v Go) zpětnému navracení zcela zabraňují převodem vzorů na deterministické konečné automaty (DFA), což zaručuje lineární časovou složitost za cenu nepodpory funkcí jako zpětné reference.
Syntaxe regulárních výrazů je standardizována volně. PCRE (Perl Compatible Regular Expressions) je nejrozšířenější varianta, podporovaná v PHP, modulu re jazyka Python a JavaScriptu s drobnými rozdíly. POSIX definuje omezenější syntaxi používanou nástrojem grep a sed. Rozdíly jsou důležité při přenášení vzorů mezi jazyky: dopředný pohled (lookahead) funkční v JavaScriptu nemusí vůbec zkompilovat v enginu RE2 jazyka Go.
Proč používat online Regex Tester?
Psaní regulárních výrazů v souboru s kódem znamená pokaždé uložit, spustit a zkontrolovat výstup. Prohlížečový regex tester zkracuje tuto zpětnou smyčku na nulu: píšete a hned vidíte shody.
Případy použití Regex Testeru
Stručná referenční příručka syntaxe regex
Následující tabulka pokrývá nejpoužívanější regex tokeny. Fungují v JavaScriptu, Pythonu, Go, PHP a většině PCRE-kompatibilních enginů. Jazykově specifická rozšíření (jako podmíněné vzory Pythonu nebo pojmenované skupiny JavaScriptu se syntaxí \k) jsou uvedena v sekci s příklady kódu.
| Vzor | Název | Popis |
|---|---|---|
| . | 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 |
Vysvětlení příznaků regulárních výrazů
Příznaky (také nazývané modifikátory) mění způsob, jakým engine zpracovává vzor. V JavaScriptu je přidáváte za uzavírající lomítko: /vzor/gi. V Pythonu je předáváte jako druhý argument: re.findall(vzor, text, re.IGNORECASE | re.MULTILINE). Ne všechny příznaky jsou dostupné v každém jazyce.
| Příznak | Název | Chování |
|---|---|---|
| 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 |
Příklady kódu
Funkční příklady regulárních výrazů v JavaScriptu, Pythonu, Go a na příkazovém řádku. Každý příklad ukazuje sestavení vzoru, extrakci shod a výstup.
// 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