Regex Tester

Проверяйте регулярные выражения по строке и смотрите все совпадения с подсветкой

Попробовать пример

Шаблон

//g

Строка для проверки

Работает локально · Безопасно вставлять секреты

Что такое регулярное выражение?

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

Движок regex читает шаблон слева направо, поглощая символы входной строки по мере попытки совпадения. При частичном несовпадении он использует возврат (backtracking): делает шаг назад и пробует альтернативные пути по шаблону. Некоторые движки (например, RE2 в Go) полностью избегают возврата, преобразуя шаблоны в детерминированные конечные автоматы (DFA). Это гарантирует линейное время поиска, но не поддерживает обратные ссылки.

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

Зачем использовать онлайн-тестер regex?

Написание regex в файле кода означает сохранение, запуск и проверку вывода при каждом изменении шаблона. Браузерный тестер regex сводит эту обратную связь к нулю: вы вводите — и сразу видите совпадения.

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

Сценарии использования Regex Tester

Валидация форм на фронтенде
Создавайте и проверяйте шаблоны для полей email, номера телефона или банковской карты перед их встраиванием в атрибуты pattern HTML5 или логику валидации на JavaScript.
Разбор логов на бэкенде
Пишите regex-шаблоны для извлечения временных меток, кодов ошибок или IP-адресов из логов приложений. Тестируйте на реальных образцах логов, чтобы убедиться, что шаблон захватывает нужные группы.
DevOps и инфраструктура
Отлаживайте regex в блоках location Nginx, правилах rewrite Apache или правилах алертов Prometheus. Неверный шаблон в конфигурации сервера может сломать маршрутизацию или пропустить важные оповещения.
QA и автоматизация тестирования
Проверяйте соответствие тел ответов или HTML-вывода ожидаемым шаблонам в end-to-end тестах. Протестируйте 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 приблизительно эквивалентен регулярному выражению ^.*\.json$.
Как найти буквальную точку или скобку в regex?
Добавьте перед символом обратный слэш: \. соответствует буквальной точке, \[ — буквальной скобке. Внутри класса символов [] точка уже является буквальной и не требует экранирования. Типичная ошибка — написать 192.168.1.1 без экранирования точек, что совпадёт с 192x168y1z1, поскольку . означает «любой символ».
Отправляются ли мои тестовые данные на сервер?
Нет. Инструмент выполняет сопоставление regex полностью в вашем браузере с помощью движка JavaScript RegExp. Никаких сетевых запросов с вашим текстом или шаблоном не производится. Убедиться в этом можно, открыв вкладку Network в 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> по отдельности.