
Однажды мы в documentat.io решили спасти наших техписов от рутинной ручной замены кавычек и написали для них статью про умную автозамену — с использованием регулярных выражений. Теперь решили поделиться ей на Хабре.
Надеемся, она поможет вам разобраться, как работают регулярные выражения, и пригодится в качестве шпаргалки.
Какую проблему решаем?
Представьте, что вам нужно заменить дефисы на длинные тире в вордовском документе или Markdown-файле на 100500 символов, в котором много блоков кода. Использовать обычную автозамену нельзя — она покосит ваш газон вместе с клумбой и забором. Перед вами выбор:
- Делать это вручную всю ночь. 
- За 15 минут настроить умную автозамену и всё быстро поправить. Освободившуюся ночь потратить на что-нибудь полезное. 
Если вы за второй вариант, самое время разобраться с регулярными выражениями.
Что такое регулярные выражения?
Регулярные выражения — это шаблоны поиска и замены фрагментов текста, доступные в большинстве современных редакторов.
Для создания шаблона используются метасимволы (символы-джокеры, wildcard characters), каждый из которых соответствует любым символам из определённой группы. Например, \S обозначает любой символ, кроме пробела, а \d — любую цифру. Джокеры можно в произвольном порядке комбинировать с обычными символами, накладывать на них разнообразные условия и группировать при помощи скобок. Это и позволяет настроить умную автозамену.
Как начать использовать регулярные выражения?
Инструмент обычно активируется флажком, привязанным к полям Найти и Заменить (CTRL + H) в текстовом редакторе.
В разных редакторах синтаксис регулярных выражений может немного различаться. При необходимости воспользуйтесь справкой вашего редактора.
Работоспособность всех примеров из этой статьи проверена в VS Code.
Дисклеймер: Любая автозамена может поломать в тексте конструкции, которые вы ломать не планировали. Делайте бекапы и внимательно проверяйте, что результаты поиска соответствуют вашим ожиданиям. И да поможет вам CTRL + Z!
Справочник по синтаксису
Большинство символов в регулярных выражениях представляют сами себя, за исключением специальных символов: [ ] \ / ^ $ . | ? * + ( ) { }. Чтобы представить их в качестве символов текста, установите перед ними обратную косую черту, например: \[ — левая квадратная скобка.
Далее приведены таблицы с символами-джокерами и символами операций, которые используются для построения регулярных выражений.
Символы-джокеры
| Символ-джокер | Чему соответствует | Пример | 
| \d | Любая цифра от 0 до 9 | 
 | 
| \D | Любой символ, кроме цифры | 
 | 
| \s | Пробел или знак табуляции | 
 | 
| \S | Любой символ, кроме пробельного | 
 | 
| \w | Латинская буква, цифра или знак подчёркивания | 
 | 
| \W | Любой символ, кроме латинской буквы, цифры или знака подчёркивания | 
 | 
| . | Любой символ | 
 | 
| \b | Граница слова (работает только с латиницей) | 
 | 
| ^ | Начало строки | 
 | 
| $ | Конец строки | 
 | 
Символы условий, диапазонов и группировки
| Символ | Значение | Пример | 
| * | Предыдущий символ повторяется любое количество раз (включая 0) | 
 | 
| + | Предыдущий символ повторяется 1 и более раз | 
 | 
| ? | Предыдущий символ повторяется 0 или 1 раз (но не более) | 
 | 
| {2} | Предыдущий символ повторяется ровно указанное число раз | 
 | 
| {2,} | Предыдущий символ повторяется указанное число раз или больше | 
 | 
| | | Логическое ИЛИ | 
 | 
| [ ] | Любой из перечисленных символов, диапазон | 
 
 
 | 
| [^ ] | Логическое НЕ. Всё, что не соответствует указанному символу или не попадает в диапазон | 
 | 
| ( ) | Группировка символов. Символы условий применяются ко всей группе, за которой стоят | 
 Для сравнения без скобок: 
 | 
| \ | Экранирование служебных символов | 
 | 
| \2 | Подстановка группы с указанным номером. Группы объявляются круглыми скобками. Номер группы — это порядковый номер открывающей скобки | 
 Найдёт фразы типа  | 
Специальные символы для поля замены
| Символ | Назначение | Пример | 
| $2 или \2 | Подстановка группы с указанным номером. Синтаксис может быть таким же, как в  поле поиска ( | Поиск:  | 
| \u | Переводит первую букву следующей группы в верхний регистр | Поиск:  | 
| \U | Переводит все буквы следующей группы в верхний регистр | Поиск:  | 
| \L | Переводит все буквы следующей группы в нижний регистр | Поиск:  | 
| \l | Переводит первую букву следующей группы в нижний регистр | Поиск:  | 
Примеры регулярных выражений
| В поле поиска | В поле замены | Что делает? | 
| 
 | 
 | Заменяет множественные пробелы на один, не трогая выравнивающие пробелы, которые стоят в начале строки. Позволяет не поломать отступы в примерах кода. Первая  | 
| 
 | 
 | Заменяет дефисы-вместо-тире на тире. Не затронет нормальные дефисы и комбинации типа  | 
| 
 | Поле замены оставьте пустым | Удаляет пробелы в конце строк | 
| 
 | 
 | Заменяет  | 
| 
 | 
 | Заменяет маркировку списков в Markdown со  | 
Как подобрать регулярное выражение самому?

Лучший способ научиться составлять регулярные выражения — потренироваться.
Мы подготовили для вас ужасающий пример текста. Скопируйте его в пустой текстовый файл в вашем любимом текстовом редакторе.
Как здесь автоматически заменить " " на « » в названиях компаний, не затронув примеры кода?
- Выделите в искомых фрагментах характерные особенности, которые будут основой шаблона поиска. 
 Вам повезло — все компании названы по-русски. Значит, в качестве основы шаблона можно взять кириллические символы в кавычках. Нажмите CTRL + H, включите в поле поиска регулярные выражения, наберите:- "[а-я]+"и нажмите Найти.
- Проанализируйте результат поиска. Попадают ли в заданный шаблон лишние элементы или каких-то элементов не хватает? Корректируйте шаблон поиска, пока не убедитесь, что он в полной мере решает свою задачу. 
 Поиск проигнорировал словосочетания, поскольку в шаблоне не указано, что кроме букв в кавычках могут встречаться пробелы. Исправьте это:- "([а-я]|\s)+". Скобки здесь необходимы для группировки, чтобы- +относился ко всей конструкции, а не только к- \s. Теперь в результаты поиска попадают все названия компаний.
- Определите, какие части найденного текста должны остаться без изменений. Сгруппируйте соответствующие им элементы в поле поиска с помощью скобок. В поле замены вы сможете ссылаться на эти группы по номеру. Номер группы — это порядковый номер открывающей скобки. 
 Без изменений должны остаться все символы в кавычках, поместите их в скобки:- "(([а-я]|\s)+)"
- Подберите шаблон замены, используя подготовленные группы. 
 В поле замены сошлитесь на группу из поля поиска. Нам нужно всё содержимое кавычек, а не отдельные символы, то есть группа с номером 1. Поставьте вокруг нужные кавычки:- «$1»(или- «\1»).
- Нажмите Заменить всё и наслаждайтесь результатом! 
Попробуйте на том же примере выполнить ещё несколько упражнений, не меняя ничего вручную, используя только регулярные выражения:
- Приведите аббревиатуры ООО, ЗАО и ОАО к должному виду. 
 Поиск: ( ооо | зао | оао )
 Замена: \U$1
- Переставьте инициалы, чтобы они стояли после фамилий. Поставьте между инициалами пробелы. 
 Поиск: ([а-я]\.)\s?([а-я]\.)\s?([а-я]+)
 Замена: $3 $1 $2
- Приведите все номера телефонов к международному формату: +7-000-000-0000 
 Поиск: 8?-?(\d{3})-?(\d{3})-?(\d{4})
 Замена: +7-$1-$2-$3
Авторы: Костя Макушев, Ната Мелихова
Редактор: Ната Мелихова
Комментарии (3)
 - init018.12.2023 15:36- <p>.*</p>Найдёт теги- <p>и- </p>и весь текст между ними. Если текста нет, найдёт только теги:- <p></p>- Ошибочный пример т.к. эта регулярка в коде - <div><p>Test</p><p>Test</p></div>- найдет - <p>Test</p><p>Test</p>- т.к. по дефолту квантор "жадный", вот так будет правильно:- <p>.*?</p>- А вообще регулярки для поиска/парсинга в HTML моветон 
 
           
 
vovasik
очень понравилось, жду два отдельных поста на хабре про if и else. Спасибо большое
makushevkm Автор
Товарищи синьор-разрабы, проходите мимо, не задерживайте очередь, это не для вас написано :)