Тестер RegEx, замена и шпаргалка
Проверяйте регулярные выражения с подсветкой совпадений и групп, просматривайте результат замены и копируйте шаблон в виде кода для шести языков.
Подробности совпадений и группы
Шпаргалка
Нажмите на шаблон, чтобы загрузить его вместе с примером текста.
Справка по синтаксису
Символы
| . | Любой символ, кроме перевода строки (с флагом s — включая его) |
| \d \D | Цифра 0–9 / не цифра |
| \w \W | Символ слова (A–Z, a–z, 0–9, _) / не символ слова |
| \s \S | Пробельный символ / непробельный символ |
| [abc] [^abc] | Один из a, b, c / любой, кроме a, b, c |
| [a-z] | Символ в диапазоне от a до z |
| \p{L} | Буква любого языка (нужен флаг u) |
| \. \\ \( | Экранирование специального символа для поиска как есть |
Квантификаторы
| * + ? | 0 или больше / 1 или больше / 0 или 1 |
| {n} {n,} {n,m} | Ровно n / n или больше / от n до m |
| *? +? {n,m}? | Ленивый: как можно меньше символов |
Якоря
| ^ $ | Начало / конец текста (каждой строки с флагом m) |
| \b \B | Граница слова / не граница слова |
Группы и проверки
| (…) | Захватывающая группа, используется как $1, $2 … |
| (?:…) | Группа без захвата |
| (?<name>…) | Именованная группа, используется как $<name> |
| \1 \k<name> | Обратная ссылка: тот же текст, что захватила группа |
| a|b | a или b |
| (?=…) (?!…) | За которым следует / не следует |
| (?<=…) (?<!…) | Перед которым есть / нет |
Замена
| $1 $<name> | Текст нумерованной или именованной группы |
| $& $$ | Всё совпадение / символ $ |
Как пользоваться
- Введите шаблон в поле «Регулярное выражение» без обрамляющих косых черт и флагов, а текст вставьте в поле «Тестовая строка». Совпадения подсвечиваются в блоке «Совпадения» и подсчитываются по мере ввода. Чтобы начать с примера, нажмите на шаблон в разделе «Шпаргалка»; при этом текущий шаблон, флаги, тестовая строка и параметры замены будут заменены.
- Отметьте нужные флаги в разделе «Флаги»; наведите указатель на букву, чтобы увидеть, что делает флаг. При открытии страницы включены g и u. Без g находится и заменяется только первое совпадение.
- Изучите блок «Подробности совпадений и группы»: в нём каждое совпадение указано вместе с позицией и текстом каждой группы в виде $1, $2 и т. д., а у именованных групп — с их именами. Включите флаг d, чтобы также видеть, где начинается и заканчивается каждая группа.
- Чтобы проверить замену, отметьте «Заменить совпадения на» и введите текст замены, используя $1 или $<name> для групп. Изменённый текст появляется в блоке «Результат замены», а кнопка «Копировать результат» копирует его.
- В разделе «Генератор кода» выберите JavaScript, Python, Java, PHP, Go или C# и нажмите «Копировать код». Если отмечено «Заменить совпадения на», фрагмент кода включает и замену. Кнопка «Копировать как /шаблон/флаги» копирует шаблон в виде литерала регулярного выражения JavaScript.
Частые вопросы
Отправляется ли куда-нибудь проверяемый текст?
Нет. Шаблон и тестовая строка сопоставляются в вашем браузере его собственным движком регулярных выражений JavaScript и не отправляются в LeedyBox. Инструмент их также не сохраняет.
Почему шаблон находит больше текста, чем я ожидал?
Шаблон совпадает везде, где подходит, поэтому \d{3} находит и 123 внутри 12345. Добавьте \b с обеих сторон, чтобы искать целые слова или числа, или используйте ^ и $, чтобы требовать совпадения всего текста (или каждой строки при включённом флаге m), как это делает шаблон пароля в шпаргалке. \b опирается на символы слова из \w (A–Z, a–z, 0–9 и _) и считает буквы вроде é, ж или 한 символами, не входящими в слово, поэтому \bcafé\b не находит café, если за ним следует пробел. Кроме того, квантификаторы + и * жадные: в строке <b>x</b> шаблон <.+> захватывает всю строку, а <.+?> или <[^>]+> останавливается на первом >.
Почему шаблон, который работает в Python, PHP или Java, здесь выдаёт ошибку RegEx?
Эта страница использует движок JavaScript, который не принимает часть синтаксиса других движков, например именованные группы (?P<name>…), встроенные флаги вроде (?i) в начале, атомарные группы (?>…) и сверхжадные (possessive) квантификаторы вроде a++. Записывайте именованные группы как (?<name>…) и вместо встроенных флагов используйте флажки в разделе «Флаги». С флагом u JavaScript также строже относится к экранированию: \# считается ошибкой, как и \- вне квадратных скобок, поэтому удалите обратную косую черту или отключите u.
Почему \p{L} не находит буквы, а эмодзи считается двумя символами?
Классам свойств Unicode, таким как \p{L}, нужен флаг u; без него JavaScript читает \p{L} как обычный текст p{L}, а точка (.) совпадает только с половиной символа за пределами базовой многоязычной плоскости (BMP), к которым относятся многие эмодзи. При загрузке шаблона из шпаргалки загружаются и его флаги, и во всех шаблонах, кроме «Специальные символы», флаг u выключен, поэтому, прежде чем добавлять такой синтаксис, проверьте раздел «Флаги». Даже с флагом u точка совпадает с одной кодовой точкой, а некоторые эмодзи, например флаги или поднятый большой палец с оттенком кожи, состоят из двух и более кодовых точек. Позиции в подробностях совпадений считаются в кодовых единицах UTF-16, как в JavaScript, поэтому символы за пределами BMP занимают две позиции даже с флагом u.
Почему \n в замене не вставляет перевод строки?
Замена подчиняется правилам метода replace() в JavaScript: особое значение имеют только последовательности, начинающиеся с $, поэтому \n и \t вставляются как обратная косая черта с буквой, а не как перевод строки или табуляция. Поле однострочное, поэтому ввести в него перевод строки нельзя; добавьте его в сгенерированном коде. Чтобы удалить совпадения, отметьте «Заменить совпадения на» и оставьте поле пустым, как в шаблоне «Удалить теги HTML/XML» из шпаргалки.
Что будет, если шаблон работает очень медленно или находит очень много совпадений?
Если браузер позволяет использовать Web Workers, сопоставление выполняется в фоновом потоке и останавливается через 2 секунды, поэтому шаблон с катастрофическим возвратом, например (a+)+$ на длинной цепочке букв a, за которой следует другой символ, выводит сообщение, а не подвешивает страницу. Счётчик в блоке «Совпадения» учитывает все совпадения, но подсвечиваются и показываются в подробностях только первые 1000.
Можно ли вставить сгенерированный код в проект как есть?
Используйте его как отправную точку. Генератор записывает шаблон как литерал регулярного выражения в JavaScript и как строку в остальных языках, переписывает именованные группы и ссылки в замене там, где синтаксис отличается, например (?P<name>…) и \g<1> в Python, переносит флаги i, m и s и ожидает входные данные в переменной text. Если в шаблоне есть кавычки или косые черты, проверьте, правильно ли они экранированы во фрагменте кода. Движки всё равно различаются: пакет regexp в Go использует синтаксис RE2, который не поддерживает опережающие и ретроспективные проверки и обратные ссылки, а стандартный модуль re в Python не поддерживает классы \p{…}, поэтому проверьте код на своих данных.