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

в 7:11, , рубрики: sql, Visual Studio, работа с текстом, разработка, Регулярные выражения, метки: , ,
Введение

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

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

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

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

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:WebsitesLeisureProXslFilesLP_BOFirstBackordered.xslt', 'D:WebsitesLeisureProXslFilesLP_BOFirstBackordered.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 (nt2, '1', 'D:\Websites\LeisurePro\XslFiles\LP_BO\1.xslt', 'D:\Websites\LeisurePro\XslFiles\LP_BO\1.xslt', 0, 1n);

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

Заключение

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

image

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

Автор: brainx64

Поделиться

  1. igaraev:

    Проще такое сделать с помощью макросов в Notepad++ или в Far Manager. Я такие задачи именно так и делаю. Хотя регулярные выражения тоже мне хорошо знакомы. Но макрос (последовательность нажатия клавиш) можно написать очень быстро.

* - обязательные к заполнению поля