Как пользоваться тестером регулярных выражений
- Введите шаблон без окружающих косых черт, например
\d{3}-\d{4}. - Включите нужные флаги (
g,i,m,s,u,y). - Вставьте тестовый текст. Совпадения подсвечиваются на лету, а каждая группа захвата перечисляется в списке.
- При желании введите строку замены, используя
$1или$<name>для групп, чтобы просмотреть результат.
Тестер использует встроенный движок регулярных выражений JavaScript вашего браузера. Ваши шаблоны и тестовые данные остаются на вашем устройстве и не загружаются и не сохраняются.
Синтаксис регулярных выражений JavaScript вкратце
Диалекты регулярных выражений различаются между языками. Этот инструмент использует диалект JavaScript (ECMAScript), поэтому результаты совпадают с тем, что делают RegExp, String.prototype.match и replace в браузерах и Node.js. Большая часть синтаксиса переносится в Python, PCRE и Java, но детали, такие как синтаксис именованных групп и поддержка lookbehind, различаются.
Флаги
| Флаг | Название | Действие |
|---|---|---|
g | global | Находит все совпадения, а не останавливается после первого. |
i | ignoreCase | Поиск без учёта регистра. |
m | multiline | ^ и $ совпадают в начале и конце каждой строки. |
s | dotAll | . совпадает также с переносами строк. |
u | unicode | Обрабатывает шаблон как кодовые точки Unicode; включает экранирования свойств \p{...}. |
y | sticky | Совпадает только в позиции, заданной lastIndex. |
Строительные блоки
- Классы символов:
[abc], диапазоны[a-z], отрицание[^0-9], сокращения\d(цифра),\w(символ слова),\s(пробельный символ) и их отрицания\D,\W,\S. Без флагаu\wи\dохватывают только ASCII. - Квантификаторы:
*(0 или более),+(1 или более),?(0 или 1),{n},{n,},{n,m}. Добавьте?, чтобы сделать их ленивыми:.*?. - Группы:
(...)захватывает,(?:...)группирует без захвата,(?<year>\d{4})создаёт именованную группу, а\1или\k<year>ссылается на неё. - Якоря:
^,$и граница слова\b. - Lookaround:
(?=...)положительный lookahead,(?!...)отрицательный lookahead,(?<=...)положительный lookbehind,(?<!...)отрицательный lookbehind. Они проверяют контекст, не поглощая символы.
// Суммы после знака доллара, без самого знака
/(?<=\$)\d+(?:\.\d{2})?/g "Total: $42.50" → "42.50"
// Переформатирование дат с помощью именованных групп
"2024-03-15".replace(/(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/, "$<d>.$<m>.$<y>")
// "15.03.2024"
Распространённые шаблоны
| Назначение | Шаблон | Ограничения |
|---|---|---|
| Email (простой) | ^[^\s@]+@[^\s@]+\.[^\s@]+$ | Только базовая проверка. Полный синтаксис адреса гораздо сложнее; подтверждайте отправкой письма. |
| Адрес IPv4 | ^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$ | Отвергает октеты больше 255 и ведущие нули. Не работает с IPv6. |
| Дата (YYYY-MM-DD) | ^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$ | Принимает невозможные даты, например 2023-02-31. Проверяйте с помощью библиотеки дат. |
| URL (http/https) | ^https?:\/\/[^\s/$.?#][^\s]*$ | Нестрогая проверка. Для настоящего разбора используйте конструктор URL. |
Для IP-адресов в частности конвертер IP-адресов разбирает и конвертирует как IPv4, так и IPv6.
Ловушки
Катастрофический откат
Вложенные или пересекающиеся квантификаторы могут заставить движок с откатами, такой как в JavaScript, перебирать экспоненциальное число путей, когда совпадение не находится. Несколько десятков символов могут заморозить вкладку браузера или, на сервере, сделать возможной атаку типа «отказ в обслуживании» (ReDoS):
/^(a+)+$/.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!") // может зависнуть
/^a+$/.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!") // мгновенно
Избегайте шаблонов вроде (a+)+, (a|a)* или (.*)*, делайте альтернативы взаимоисключающими и будьте конкретны: внутри кавычек [^"]* безопаснее, чем .*.
Другие подводные камни
- Регулярное выражение с флагом
gзапоминаетlastIndex, поэтому повторные вызовыtest()для одного и того же объекта чередуютtrueиfalse. - При построении шаблона из строки обратные косые черты нужно удваивать:
new RegExp("\\d+"). - Если забыть
^и$, валидатор будет принимать любой ввод, который лишь содержит совпадение.
Часто задаваемые вопросы
Почему моё регулярное выражение работает здесь, но не в Python или PHP?
Диалекты различаются. Python записывает именованные группы как (?P<name>...) и поддерживает только lookbehind фиксированной ширины; PCRE в PHP заключает шаблоны в разделители. Правила экранирования в строковых литералах тоже различаются между языками.
В чём разница между жадными и ленивыми квантификаторами?
Жадные квантификаторы (.*) захватывают как можно больше, а затем отступают; ленивые (.*?) захватывают как можно меньше. Для <b>x</b> выражение <.*> совпадает со всей строкой, а <.*?> — только с <b>.
Поддерживает ли JavaScript lookbehind?
Да, начиная с ES2018, и, в отличие от многих движков, допускает lookbehind переменной длины. Его поддерживают все современные основные браузеры.
Как найти буквальную точку или скобку?
Экранируйте её обратной косой чертой: \., \[, \(. Внутри класса символов большинство символов буквальные, поэтому [.] тоже совпадает с точкой.
Обновлено
Комментарии
Войдите, чтобы оценить этот инструмент.
Поделитесь советом, задайте вопрос или расскажите, как вам помог инструмент.
Комментариев пока нет. Расскажите первым, как всё прошло.