Начнем с самого простого. И самым простым будет телефонный номер. Варианты записи телефонных номеров могут быть различными.

Например: 8 499 1234567 или +74991234567 или (499) 123-45-67.
Для каждого случая можно создать шаблон. Вспомним, что \d в регулярных выражениях - это любая цифра. Получим несколько вариантов шаблонов.

Телефонный номер Шаблон
8 499 1234567 8 499 \d\d\d\d\d\d\d
+74991234567 +7499\d\d\d\d\d\d\d
(499) 123-45-67 (499) \d\d\d-\d\d-\d\d
8 499 1234567 8 499 \d{7}

Допустим, у нас есть набор номеров вида 499 123-45-67 и их требуется преобразовать в +7 (499) 1234567. В этом случае для поиска указываем шаблон (\d\d\d) (\d\d\d)-(\d\d)-(\d\d). Расшифрую: 3 цифры, пробел, 3 цифры, дефис, 2 цифры, дефис, 2 цифры. Шаблон замены имеет вид +7 ($1) $2$$3$$4. +7 - это постоянная неизменяющаяся часть. Записывается как константа и воспроизводится без изменения. ($1) - это префикс телефона. Для Москвы префикс один из вариантов 495 или 499. Т.к. мы хотим, чтобы после замены он был в скобках, например, (495), то в шаблоне замены пишем скобки. $2, $3 и $4 - операнды замены.

Следующий пример взят, что называется, из жизни. Есть текст такого вида (взято описание продукта с яндекс маркет):
Тип
ЖК-телевизор
Диагональ
19” (48 см)
Формат экрана
16:9
Разрешение
1366x768
Разрешение HD
720p HD
Светодиодная (LED) подсветка
есть
Стереозвук
есть
Индекс частоты обновления
100 Гц
Год создания модели
2014

На выходе должно получаться:

Тип: ЖК-телевизор
Диагональ: 19” (48 см)
Формат экрана: 16:9
Разрешение: 1366x768
Разрешение HD: 720p HD
Светодиодная (LED) подсветка: есть
Стереозвук: есть
Индекс частоты обновления: 100 Гц
Год создания модели: 2014

 

Две строки должны быть объединены в одну и между ними должно появиться двоеточие. Отлично. В группе фильтров Replace (Заменить) выбираем фильтр Find Pattern (Perl Style) (Найти выражение в виде Perl). В общем виде мы ищем строку. Строка - это набор любых букв, цифр и других символов, заканчивающаяся символом конец строки. Вспоминаем. Любой символ обозначается точкой. Для обозначения того, что символов несколько используется символ звездочка. При этом не забываем про конец строки. Наше первое регулярное выражение принимает вид .* ¶ Отлично. В программе при использовании для поиска этого выражения и замены его на другое выражение требуется взять его в круглые скобки. Для каждой строки мы получаем: (.* )¶ Так как нам надо заменять одновременно 2 строки, получаем:

(.* )¶
(.* )¶

На рисунке 11-1 используемое выражение вы можете это заметить справа вверху. Внизу записано другое выражение: $1: $2 Символом доллара и цифрой в программе обозначаются выражения на что осуществляется замена. Цифра соответствует номеру выражения, используемого при поиске. Первая круглая скобка и символ конца строки соответствуют первой строке, вторая круглая скобка и символ конца строки соответствуют второй строке.

В Trial (пробном) окне у нас текст
Тип
ЖК-телевизор
Диагональ
19” (48 см)
Формат экрана
16:9
Разрешение
1366x768
Разрешение HD
720p HD
Светодиодная (LED) подсветка
есть
Стереозвук
есть
Индекс частоты обновления
100 Гц

Запускаем программу на выполнение пробного варианта и получаем такой результат:

Тип: ЖК-телевизор
Диагональ: 19” (48 см)
Формат экрана: 16:9
Разрешение: 1366x768
Разрешение HD: 720p HD
Светодиодная (LED) подсветка: есть
Стереозвук: есть
Индекс частоты обновления
100 Гц

Все получилось как мы и хотели кроме двух последних строк. Они не изменились. Я сознательно сделал тут ошибку. Моей целью было привлечение вашего внимания к проблеме корректности вводимых данных. Хорошие программисты всегда начинают разбор ошибок с проверки данных. Что же с ними не так? Вспоминаем, что в выражении поиска был символ конца строки, которого нет в последней строке. Из-за его отсутствия последние две строки не были заменены. Если в конце текста его добавить и запустить программу на выполнение - результат будет правильным!

Ну что же. Отлично. На этом можно было бы закончить главу, но затронем еще одну тему.

Эта тема - отладка создаваемого нами фильтра и поиск возникающих ошибок. Как можно облегчить свою задачу.

В начале работы с программой вы наверняка столкнетесь с проблемами при использовании регулярных выражений. Есть возможность облегчить свою жизнь. На этом же примере я покажу как это можно сделать.
Верхнюю часть фильтра мы трогать не будем. А вот над нижней «поиздеваемся» как следует. Обратите внимание: т.к. в верхней части было использовано два выражения для поиска, то в нижней части вы можем использовать не более двух выражений для замены. Использование символа $3 вызовет ошибку. Но! Кроме $1 и $2 мы можем использовать $0. $0 - это все наше выражение в целом!

Добавим в нижней части такой текст:

$1: $2¶
----------¶
0 - $0¶
1 - $1¶
2 - $2¶
~~~~~~~~~~¶

Для первых двух строк в Trial области у нас такой текст:

Тип¶
ЖК-телевизор¶
Запускаем программу с внесенными изменениями на исполнение. Получаем:

Тип: ЖК-телевизор¶
----------¶
0 - Тип¶
ЖК-телевизор¶

1 - Тип¶
2 - ЖК-телевизор¶
~~~~~~~~~~¶
Для удобства я добавил разделители. Разберемся с полученным результатом. $0 выводит исходные данные, которые можно использовать для проверки их корректности. $1 выводит информацию о том, что было найдено в первом выражении. Соответственно $2 - о втором. Далее, если вдруг у нас есть ошибки, мы просто проверяем все ли было правильно, все ли так, как мы хотели и себе представляли.

Результат  Замена
Тип: ЖК-телевизор Это - результат работы программы
0 - Тип¶
ЖК-телевизор¶
$0
1 - Тип $1
2 - ЖК-телевизор $2