Регулярные выражения для технических писателей и не только
Однажды мы в 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
Авторы: Костя Макушев, Ната Мелихова
Редактор: Ната Мелихова