вторник, 30 октября 2007 г.

Использование GREP в InDesign. Часть 1. Примеры использования регулярных выражений.

Самый простой способ познакомиться с регулярными выражениями, и убедиться в их превосходстве над обычным поиском по тексту – рассмотреть несколько примеров.
Стандартный поиск по тексту в InDesign CS2 позволяет использовать четыре шаблона (^9 - для любой цифры, ^$ - для любой буквы, ^? - для любого символа и ^w - для любого пробела). Эти же шаблоны можно использовать и в InDesign CS3 во вкладке поиска по тексту (Text). Эти без сомнения полезные шаблоны, однако имеют ряд очевидных ограничений: используя эти шаблоны нельзя организовать поиск повторяющихся элементов (например, чтобы найти все числа в тексте придется последовательно перебирать сначала все числа из одной цифры, затем из двух, из трех и т.д.), так же шаблоны нельзя использовать в строке замены (можно использовать Рисунок ^9 для поиска последовательности состоящей из слова “Рисунок” и следующей за ним цифры, однако замена данной последовательности на что-либо приведет к потере цифры).
При использовании же регулярных выражений, для замены всех слов “Рисунок” с последующей цифрой на слово “Фото” с сохранением цифры, достаточно в строке поиска указать Рисунок (\d), а в строке замены Фото $1. Последовательность $1 в строке замены является указателем на результат поиска заключенный в скобки в строке поиска. Более общий случай данного примера, выглядит так: строка поиска: Рисунок (\d+), строка замены: Фото $1, и позволяет найти и заменить все слова “Рисунок” с последующим целым числом (т.е. последовательностью из одной или более цифр) на слово “Фото” с сохранением следующего числа.
Еще один пример использования регулярных выражений для поиска последовательности символов. Довольно часто возникает задача поиска последовательности из прописных букв и применения к ней символьного стиля (обычно small caps для создания капителей). Эта задача так же имеет очень простое решение при использовании GREP. Строка поиска: \u\u+, строку замены в данном случае нужно оставить пустой (так как менять мы будем только форматирование), а в поле Change Format нужно указать символьный стиль который мы хотим применить к результату поиска. Метасимвол \u в данном примере обозначает все прописные буквы, знак + как и предыдущем примере означает (один или несколько), таким образом наш поисковый запрос найдет последовательность минимум из двух прописных букв.
Другая сильная сторона GREP – использование альтернатив. Например чтобы найти слова “слон” и “клон” можно использовать выражение (с|к)лон. Расширенная версия данного выражения – (с|к)лоны? может быть использована для поиска формы множественного числа (в результате будут найдены слова “слон”, “клон”, “слоны”, “клоны”). Знак вопроса в данном выражении означает, что буква “ы” может присутствовать на конце слова, а может и отсутствовать. Еще один пример простого, но одновременно мощного выражения – д[аоуеиыэюя]м. Данное выражение соответствует такой последовательности: буква “д”, затем гласная, затем буква “м”. Эта последовательность может быть как отдельным словом (дом, дым), так и встречаться внутри более длинного слова (задуматься, дымиться). В дальнейшем мы рассмотрим как осуществлять поиск только по словам целиком. Этот пример так же демонстрирует как определить свои собственные шаблоны, в данном случае шаблон для гласных букв.
В качестве последнего примера используем задачу которая может встретиться в реальной работе. По условию задачи у нас есть список контактов, в которых среди прочей информации указан адрес электронной почты. Наша задача добавить слово “E-mail:” перед каждым адресом. Убедимся что знак “@” в тексте больше нигде не встречается, т.е. если строка содержит знак “@”, то эта строка является адресом электронной почты. Теперь нам осталось записать выражение которое означает “если строка содержит знак “@”, добавить в начале слово “E-mail”. Данное выражение записывается следующим образом ^(.+@). В поле замены указываем слово “E-mail” за которым следует результат поиска по выражению заключенному в скобки (который в каждом случае является текстом между началом абзаца и символом “@”).

8 комментариев:

Анонимный комментирует...

очень жаль что ты забросил рассказы о греп'е и вообще рассказы с описаниями. очень хороший стиль изложения - даже мне все понятно. а щас еще и пригодилось в работе :-)))
спасибо в любом случае!

Rost комментирует...

А вот и первый комментарий! Чесно говоря не думал что кто-нибудь читает этот блог. Но, раз такое дело, обещаю продолжить.
А первого комментатора, думаю, надо как-то поощрить. ;-)) Так что если sanya.ok ты со мной свяжешся по e-mail то получишь годовую подписку на InDesign Magazine ;))

Анонимный комментирует...

Ты крут и человечен! Вообще-то, по идее, это я должен тебе подписку какую-нибудь! :-)))

Анонимный комментирует...

Побольше примеров, новых и разных!!!
Твой блог первый в списке Google на запрос "регулярные выражения в Indesign CS3".
Я думаю, что все, кто интересуется Grep`ом посетят твой блог в первую очередь...

Анонимный комментирует...

Хотелось бы спросить как при помощи GREP в InDesign найти первые три буквы первого слова на каждой странице и применить для них какой-то символьный стиль? Как найти первые три символа последнего слова на каждой странице и применить для них тот же символьный стиль? Предполагается, что переносов в словах нет (алфавитный указатель справочного издания). Спасибо.

Unknown комментирует...
Этот комментарий был удален администратором блога.
Unknown комментирует...

Замечательный ресурс! Все, что читал до сих пор написано для программистов, а не для полиграфистов. Обычно ничего не поймешь - как применить на практике. Здесь - другое дело!
И сразу конкретный вопрос: в ИНДИЗАЙНЕ в тексте надо цепочку символов типа <#00C0#> заменить на греп-последовательность типа \x{00C0}. Тогда в тексте должны появиться правильные нестандартные буквы в юникоде: с ударениями, гачеками и прочей диакритикой. Но программа сообщает, что нет такой последовательности: <#00C0#>. В чем я ошибся?

Rost комментирует...

Мне кажется я не совсем правильно понимаю вопрос. Можно посмотреть пример документа и запрос? (можно в почту).