Ускоряемся: автозамена при помощи регулярных выражений

Posted by VladymyrL on Friday, January 5, 2018

Нет такой проблемы которую нельзя было бы усугубить регуляркой (с)

Приходиось ли вам редактировать файлы полные повторяющегося кода? Гигантские файлы с тысячами строк повторяющегося кода. Если приходилось то вы меня поддержите в том что это наверное одна из самых долгих и утомительных задач в разработке. Всё-бы прекрасно решалось если бы у нас были одинаковые строки которые можно решить простой автозаменой, но так как жизнь полна неожиданностей, часто в заменяемых выражениях что-то меняется - то имя переменной другое то метод должен немного отличатся. Как раз для этих целей и был добавлен в автозамену функционал позволяющий выбирать и заменять при помощи регулярных выражений.

Регулярное выражение в этом случае сразу поможет с решением двух проблем:

  • поиск с учётом заданной регулярки
  • возможность захвата группы символов с последующей вставкой в заменяемый текст

я знаю регулярки

На деле всё выглядит следующим образом - все IDE и некоторые текстовые редакторы поддерживают замену с регулярками. К примеру нам нужно заменить строку с следующим кодом на c#

:::csharp
Enum.IsDefined(typeof( SomeEnum ), enumVariable) 

Заменить на свою реализацию:

:::csharp
Enum<SomeEnum>.IsDefined(enumVariable)

Можно пройтись по всему проекту и методично выполняя редактировать строки. Это долго и результат требует более тщательной проверки, ведь в каждой правке возможна опечатка. Решение очевидно из названия статьи - можно взять и в любимой IDE выполнить поиск с заменой при помощи регулярки:

 Enum.IsDefined\([\s]*typeof\((?<enumType>[A-z]+)\),[\s]*(?<varName>[A-z]+)\) 

а в строке замены указать:

 Enum<${enumType}>.IsDefined(${varName})

Здесь мы использовали именованые группы. Выглядят они так - (?<enumType>[A-z]+). В треуголных скобках указано имя группы. В поле для ввода текста замены можно указать имя группы - ${enumType}, и получить содержимое группы.

Некоторые IDE (Visual Code например) не поддерживают именованные группы в этом случае нужно использовать неименованые группы и обращатся к ним по индексу. Сделать это можно вот так: В поиске указать:

Promise<(\w+Dto)>

В тексте замены:

Observable<$1>

И на последок хотел бы порекомендовать просто великолепнейшую утилиту regexhero. Раньше это была вэб-утилита на сильверлайте, но с устареванием этой технологии автор перевёл своё детищи в десктопное приложение. Скачать его можно по тому же адресу.

PS: В кратце о синтаксисе регулярок


comments powered by Disqus