Pull to refresh

Поиск и замена текста по регулярному выражению

Reading time3 min
Views70K
Введение

Наверняка любой, даже самый непродвинутый пользователь ПК, умеет осуществлять поиск и замену строк к тексте. В общем случае необходимо указать строку, которую нужно заменить, и строку, на которую будет производится замена. Этого достаточно для достижения самых простых целей. Но иногда хочется большего — не просто заменить, а, например, изменить структуру строк.

Более сложная цель

Рассмотрим задачу, с которой я столкнулся в процессе своей работы. Мне кажется этот пример в достаточной мере раскрывает суть текущей темы.

Итак, в процессе разработки программного обеспечения, у меня появилась необходимость добавить в таблицу базы данных большое количество записей. Структура таблицы следующая:

image

В качестве исходных данных мне предоставили текстовый файл вида:

FirstBackordered = 38,
SecondBackordered = 39,
ThirdBackordered = 40,
FirstCreditCardDeclined = 41,
SecondCreditCardDeclined = 42,
ThirdCreditCardDeclined = 43,
FirstPayPalDeclined = 44,
SecondPayPalDeclined = 45,
ThirdPayPalDeclined = 46,
FirstDeclinedCreditCardBackordered = 47,
SecondDeclinedCreditCardBackordered = 48,
ThirdDeclinedCreditCardBackordered = 49,
FirstDeclinedPayPalBackordered = 50,
SecondDeclinedPayPalBackordered = 51,
ThirdDeclinedPayPalBackordered = 52

Похоже на выдержку из перечисления (enum), правда? Добавить несколько записей в такую таблицу не составит труда. А если таких записей 1000+? Согласитесь, вручную добавлять каждую совсем нет желания. К тому же обновлять таблицу нужно было и локально, и на тестовом сервере заказчика (а в будущем и на живом сервере тоже). Поэтому целесообразно написать SQL-скрипт. Причём можно заставить текстовый редактор написать его за меня!

Цель

Итак, задача заключается в том, чтобы каждую строку исходного текста преобразовать в SQL-запрос, который бы выполнял INSERT записи в нужную таблицу. Например:

FirstBackordered = 38,

необходимо преобразовать в:

insert into [LPEmail].[dbo].[EMAIL_TYPE]
values (
	38, 'FirstBackordered', 'D:\Websites\LeisurePro\XslFiles\LP_BO\FirstBackordered.xslt', 'D:\Websites\LeisurePro\XslFiles\LP_BO\FirstBackordered.xslt', 1, 1
);


Выполнить это можно в любом текстовом редакторе, который поддерживает поиск и замену по регулярному выражению, такие как Notepad++, Visual Studio, SQL Management Studio и др. Учтите, что формат регулярного выражения может отличаться в различных программах. В этой статье рассматривается поиск и замена текста в программных продуктах Microsoft.

Решение

Итак, напишем регулярное выражение для поиска строк в исходном текстовом файле:

^{:w}:Zs:Sm:Zs{:d:d},*$

^ — Начало строки. Совпадает с вхождением, только если оно находится в начале строки текста, в котором производится поиск;
:w — Любая строка букв. Совпадает с выражением ([a-zA-Z]+);
:Zs — Совпадает с пробелом;
:Sm — Математический символ. Совпадает с +, =, ~, |, < и >;
:d — Десятичная цифра. Совпадает с выражением ([0-9]);
$ — Конец строки. Совпадает с вхождением, только если оно находится в конце строки текста, в котором производится поиск.

В режиме Найти и заменить фигурные скобки ({}) употребляются для выражений с тегами. По такому регулярному выражению будет найдена каждая строка в исходном текстовом файле. Тегами мы сделали название (например, FirstBackordered) и номер (38). Заключенные в фигурные скобки выражения в дальнейшем можно использовать в поле «Заменить на» — \1, \2, \3 и т.д. Напишем выражение, на которое хотим заменить найденные строки:

insert into [LPEmail].[dbo].[EMAIL_TYPE]\nvalues (\n\t\2, '\1', 'D:\\Websites\\LeisurePro\\XslFiles\\LP_BO\\\1.xslt', 'D:\\Websites\\LeisurePro\\XslFiles\\LP_BO\\\1.xslt', 0, 1\n);

Как видите, используются теги \1 и \2, причём неоднократно. Эти теги заменяются на реальные подстроки, найденные в строке по регулярному выражению.

Заключение

В итоге, нажав кнопку «Заменить все» мы экономим массу времени и повышаем чувство собственного величия :D

image

Спасибо за внимание. Надеюсь помогу кому-нибудь избежать скучной конвеерной работы.
Tags:
Hubs:
-3
Comments4

Articles