
Однажды мы в 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
Авторы: Костя Макушев, Ната Мелихова
Редактор: Ната Мелихова
ссылка на оригинал статьи https://habr.com/ru/articles/780812/
Добавить комментарий