Regex Tester

Тестуйте регулярні вирази на рядку та бачте всі збіги підсвіченими

Спробувати приклад

Шаблон

//g

Тестовий рядок

Працює локально · Безпечно вставляти секрети

Що таке регулярний вираз?

Регулярний вираз (regex або regexp) — це послідовність символів, що визначає шаблон пошуку. Тестери regex дозволяють написати шаблон, застосувати його до зразкового тексту та побачити всі збіги підсвіченими в режимі реального часу. Ця концепція бере початок із праць математика Стівена Кліні щодо регулярних мов у 1950-х роках, а Кен Томпсон вбудував перший рушій regex у текстовий редактор QED у 1968 році.

Рушій regex читає шаблон зліва направо, послідовно порівнюючи символи вхідного рядка. Коли часткове співпадіння не вдається, рушій використовує метод зворотного відстеження: він повертається назад і пробує альтернативні шляхи у шаблоні. Деякі рушії (наприклад, RE2 у Go) повністю уникають зворотного відстеження, перетворюючи шаблони на детерміновані скінченні автомати (DFA), що гарантує лінійний час збігу ціною відмови від функцій на зразок зворотних посилань.

Синтаксис regex стандартизований доволі приблизно. PCRE (Perl Compatible Regular Expressions) — найпоширеніший різновид, підтримуваний PHP, модулем re у Python та JavaScript з незначними відмінностями. POSIX визначає обмеженіший синтаксис, що використовується в grep і sed. Ці відмінності важливі при перенесенні шаблонів між мовами: випередження, що працює в JavaScript, може взагалі не компілюватися в рушії RE2 мови Go.

Навіщо використовувати онлайн-тестер regex?

Написання regex у файлі коду означає збереження, запуск та перевірку виводу кожного разу, коли ви змінюєте шаблон. Браузерний тестер regex скорочує цей цикл зворотного зв'язку до нуля: ви вводите — і одразу бачите збіги.

Підсвічення збігів у реальному часі
Кожне натискання клавіші миттєво оновлює результати збігів. Ви бачите, які частини тексту збігаються, які групи захоплення заповнені, та де саме починається і закінчується кожен збіг. Жодного циклу компіляції, запуску та налагодження.
🔒
Обробка даних без передачі на сервер
Пошук збігів виконується у вашому браузері за допомогою рушія JavaScript RegExp. Жоден текст або шаблон не надсилається на сервер. Це важливо при тестуванні з файлами журналів, даними клієнтів або відповідями API, що містять чутливу інформацію.
🔍
Наочна перевірка збігів
Збіги підсвічуються прямо в тексті разом із їхніми позиціями та значеннями груп захоплення. Візуальне відображення збігів полегшує виявлення помилок «на одиницю» у квантифікаторах або відсутніх якорів.
🌐
Не потребує входу або встановлення
Працює на будь-якому пристрої з сучасним браузером. Без облікового запису, розширення чи плагіна IDE. Відкрийте сторінку, вставте шаблон і текст — і починайте тестувати.

Сценарії використання тестера regex

Валідація введення на фронтенді
Створюйте та перевіряйте шаблони для полів електронної пошти, номера телефону або кредитної картки перед тим, як вбудовувати їх в атрибути pattern HTML5 або логіку валідації JavaScript.
Розбір журналів на бекенді
Пишіть шаблони regex для вилучення часових міток, кодів помилок або IP-адрес із журналів застосунків. Тестуйте на реальних зразках журналів, щоб переконатися, що шаблон захоплює потрібні групи.
DevOps та інфраструктура
Налагоджуйте regex у блоках location Nginx, правилах перезапису Apache або правилах сповіщень Prometheus. Невірний шаблон у конфігурації сервера може порушити маршрутизацію або пропустити критичні сповіщення.
Тестування та автоматизація QA
Перевіряйте, що тіло відповіді або HTML-виведення відповідають очікуваним шаблонам у наскрізних твердженнях тестів. Протестуйте regex тут перед тим, як додавати його до набору тестів.
Конвеєри вилучення даних
Прототипуйте шаблони для вилучення структурованих полів із неструктурованого тексту: збирання цін товарів, розбір граничних випадків CSV або отримання метаданих із заголовків електронних листів.
Вивчення регулярних виразів
Експериментуйте з метасимволами, квантифікаторами та групами на зразкових рядках. Миттєвий візуальний зворотний зв'язок робить вивчення синтаксису regex значно простішим, ніж читання документації наодинці.

Короткий довідник синтаксису regex

Таблиця нижче охоплює найуживаніші токени regex. Вони працюють у JavaScript, Python, Go, PHP та більшості рушіїв, сумісних із PCRE. Розширення, специфічні для окремих мов (наприклад, умовні шаблони Python або іменовані групи JavaScript із синтаксисом \k), описані в розділі прикладів коду.

ШаблонНазваОпис
.Any characterMatches any single character except newline (unless s flag is set)
\dDigitMatches [0-9]
\wWord characterMatches [a-zA-Z0-9_]
\sWhitespaceMatches space, tab, newline, carriage return, form feed
\bWord boundaryMatches the position between a word character and a non-word character
^Start of string/lineMatches the start of the input; with m flag, matches start of each line
$End of string/lineMatches the end of the input; with m flag, matches end of each line
*Zero or moreMatches the preceding token 0 or more times (greedy)
+One or moreMatches the preceding token 1 or more times (greedy)
?OptionalMatches the preceding token 0 or 1 time
{n,m}Quantifier rangeMatches the preceding token between n and m times
()Capturing groupGroups tokens and captures the matched text for back-references
(?:)Non-capturing groupGroups tokens without capturing the matched text
(?=)Positive lookaheadMatches a position followed by the given pattern, without consuming it
(?<=)Positive lookbehindMatches a position preceded by the given pattern, without consuming it
[abc]Character classMatches any one of the characters inside the brackets
[^abc]Negated classMatches any character not inside the brackets
|AlternationMatches the expression before or after the pipe

Пояснення прапорців regex

Прапорці (також звані модифікаторами) змінюють спосіб обробки шаблону рушієм. У JavaScript їх додають після закривальної косої риски: /pattern/gi. У Python вони передаються другим аргументом: re.findall(pattern, text, re.IGNORECASE | re.MULTILINE). Не всі прапорці доступні в кожній мові.

ПрапорецьНазваПоведінка
gGlobalFind all matches, not just the first one
iCase-insensitiveLetters match both uppercase and lowercase
mMultiline^ and $ match start/end of each line, not just the whole string
sDot-all. matches newline characters as well
uUnicodeTreat the pattern and subject as a Unicode string; enables \u{FFFF} syntax
yStickyMatches only from the lastIndex position in the target string

Приклади коду

Робочі приклади regex у JavaScript, Python, Go та командному рядку. Кожен приклад демонструє побудову шаблону, вилучення збігів та виведення результатів.

JavaScript
// 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"
Python
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']
Go
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]
}
CLI (grep / sed)
# 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

Часті запитання

У чому різниця між regex та glob-шаблонами?
Glob-шаблони (наприклад, *.txt або src/**/*.js) — це спрощений синтаксис підстановки символів для зіставлення шляхів до файлів у оболонках та інструментах збирання. Вони підтримують * (будь-які символи), ? (один символ) та [] (класи символів), але не мають квантифікаторів, груп, випереджень та чергування. Regex значно виразніший і працює з довільним текстом, а не лише з файловими шляхами. Glob-шаблон *.json приблизно еквівалентний regex ^.*\.json$.
Як знайти збіг для літеральної крапки або квадратної дужки в regex?
Поставте перед символом зворотну косу риску: \. збігається з літеральною крапкою, \[ — з літеральною квадратною дужкою. Усередині класу символів [] крапка вже є літеральною і не потребує екранування. Поширена помилка — написати 192.168.1.1 без екранування крапок, що збігатиметься з 192x168y1z1, бо . означає «будь-який символ».
Чи надсилаються мої тестові дані на сервер?
Ні. Цей інструмент виконує пошук збігів повністю у вашому браузері за допомогою рушія JavaScript RegExp. Жодних мережевих запитів із вашим текстом або шаблоном не здійснюється. Ви можете переконатися в цьому, відкривши вкладку «Мережа» в DevTools браузера під час роботи з інструментом.
Чому мій regex працює в JavaScript, але не працює в Python?
JavaScript і Python використовують різні рушії regex із дещо різним набором функцій. JavaScript підтримує \d, випередження (?=) та відставання (?<=) починаючи з ES2018, але не підтримує умовні шаблони, атомарні групи або жадібні квантифікатори з присвоєнням. Модуль re у Python не підтримує класи властивостей Unicode \p{} (для цього використовуйте сторонній модуль regex). Завжди тестуйте в рушії цільової мови або звертайтеся до документації з regex для цієї мови.
Що спричиняє катастрофічне зворотне відстеження в regex?
Катастрофічне зворотне відстеження виникає, коли шаблон має вкладені квантифікатори, що створюють експоненціальну кількість шляхів збігу. Класичний приклад — (a+)+ застосований до рядка з символів a, за якими йде символ, що не збігається. Рушій перебирає всі можливі способи розподілити символи a між внутрішньою та зовнішньою групами перед тим, як відмовитися від пошуку. Виправте це за допомогою атомарних груп (?>), жадібних квантифікаторів із присвоєнням a++ або переписавши шаблон, щоб уникнути неоднозначного повторення.
Чи можна використовувати regex для розбору HTML?
Regex може вилучати прості значення з фрагментів HTML, наприклад отримати атрибут href з одиночного тегу <a>. Для повного розбору HTML використовуйте відповідний парсер: DOMParser у JavaScript, BeautifulSoup у Python або html/template у Go. HTML — це контекстно-вільна граматика, а regex обробляє регулярні граматики. Вкладені теги, необов'язкові атрибути та самозакривні елементи створюють шаблони, з якими regex не може впоратися надійно.
У чому різниця між жадібними та лінивими квантифікаторами?
Жадібний квантифікатор (* або +) збігається з якомога більшою кількістю символів, а потім відступає, якщо решта шаблону не вдається. Лінивий квантифікатор (*? або +?) збігається з якомога меншою кількістю символів, розширюючись лише за потреби. Для введення <b>one</b><b>two</b> жадібний шаблон <b>.*</b> збігається з усім рядком від першого <b> до останнього </b>, тоді як лінивий шаблон <b>.*?</b> збігається з <b>one</b> та <b>two</b> окремо.