Что такое регулярное выражение
Регулярное выражение — это шаблон для поиска текста. cat находит буквы «cat» где угодно, в том числе в «concatenate». Специальные символы позволяют шаблону описывать виды текста, а не точные буквы.
Строительные блоки
. | любой один символ, кроме перевода строки |
\d, \w, \s | цифра; буква, цифра или подчёркивание; пробел, табуляция или перевод строки |
[aeiou], [^0-9] | любой один из этих символов; любой символ, кроме цифры |
*, +, ? | ноль или больше, один или больше, ноль или один раз то, что стоит перед ними |
{3}, {2,4} | ровно 3; от 2 до 4 |
^, $ | начало и конец текста (или каждой строки с флагом m) |
\b | граница слова: \bcat\b находит «cat», но не «concatenate» |
( ), | | группа, которую можно использовать в замене; это или то |
Чтобы найти сам специальный символ, поставьте перед ним обратную косую черту: \. находит точку. В JavaScript \w и \b по умолчанию понимают только латиницу; для кириллицы используйте класс вроде [а-яё] или флаг u с \p{L}.
Примеры
\d{3}-\d{2}-\d{2}находит номера, записанные как 555-01-23.^[ \t]+|[ \t]+$с флагами g и m находит пробелы и табуляции в начале и конце каждой строки, чтобы заменить их пустотой.(\d{4})-(\d{2})-(\d{2})с заменой на$3.$2.$1превращает 2024-09-27 в 27.09.2024.
Флаги и жадность
Флаг g находит все совпадения, а не первое, i не учитывает регистр, а m заставляет ^ и $ работать построчно. Квантификаторы жадные: <.*> захватывает от первого < до последнего > в строке. Добавьте ?, чтобы они останавливались как можно раньше: <.*?>.
Пробуйте шаблоны с подсветкой в реальном времени в Проверка регулярных выражений, где используется синтаксис JavaScript, и применяйте их к своему тексту в Найти и заменить.
Шаблоны для повседневных задач
| Что найти | Шаблон |
|---|---|
| Пустые строки | ^\s*$ с флагом m |
| Повторяющиеся пробелы | {2,}, замена на один пробел |
| Всё в скобках | \([^)]*\) |
| Цена в рублях | \d+(,\d{2})? ₽ |
| HTML-тег | <[^>]+> |
| Последнее поле строки CSV | [^,]+$ с флагом m |
Перестановка с группами
Поиск (\w+), (\w+) с заменой на $2 $1 превращает «Smith, John» в «John Smith» по всему списку. Для кириллических имён используйте ([а-яёА-ЯЁ]+), ([а-яёА-ЯЁ]+). Каждая пара скобок нумеруется слева, а $0 — всё совпадение.
Частые ошибки
- Забыть, что точка означает любой символ.
file.txtнаходит и «fileXtxt». Пишитеfile\.txt. - Жадные квантификаторы берут слишком много.
".*"в строке с двумя строками в кавычках находит всё от первой кавычки до последней. Используйте".*?". - Думать, что у всех инструментов один синтаксис. Ретроспективная проверка, именованные группы и
\dвнутри символьных классов различаются в JavaScript, Python, grep и вашем редакторе. - Пытаться разбирать вложенные структуры. В HTML, JSON и коде есть вложенность, за которой регулярное выражение не уследит. Используйте парсер, а регулярные выражения оставьте для плоского текста.
- Шаблон, который зависает. Вложенные квантификаторы вроде
(a+)+bна длинной несовпадающей строке могут работать экспоненциально долго. Упростите шаблон.