На жаль GREP (Global Regular Expression Parser - «аналізатор регулярних виразів») користується поганою славою складного інструменту, доступного тільки програмістам. Насправді регулярні вирази - найпотужніший, на сьогоднішній день, спосіб пошуку текстових фрагментів в електронних документах.
Маленька історична довідка.
Приклади використання регулярних виразів.
Найпростіший спосіб познайомитися з регулярними виразами, і переконатися в їх перевазі над звичайним пошуком по тексту - розглянути кілька прикладів.
Шаблони можна використовувати і в InDesign CS3 у вкладці пошуку по тексту (Text). Ці без сумніву корисні шаблони, однак мають ряд очевидних обмежень: використовуючи ці шаблони можна організувати пошук повторюваних елементів (наприклад, щоб знайти всі числа в тексті доведеться послідовно перебирати спочатку все числа з однієї цифри, потім з двох, з трьох і т.д. ), так само шаблони можна використовувати в рядку заміни (можна використовувати Малюнок ^ 9 для пошуку послідовності складається з слова "Малюнок" і наступної за ним цифри, проте заміна даної послідовності на що-небудь приведе до втрати цифри).
При використанні ж регулярних виразів, для заміни всіх слів "Малюнок" з подальшою цифрою на слово "Фото" зі збереженням цифри, досить в рядку пошуку вказати Малюнок (\ d), а в рядку заміни Фото $ 1. Послідовність $ 1 в рядку заміни є покажчиком на результат пошуку укладений в дужки в рядку пошуку. Більш загальний випадок даного прикладу, виглядає так: рядок пошуку: Малюнок (\ d +), рядок заміни: Фото $ 1, і дозволяє знайти і замінити всі слова "Малюнок" з подальшим цілим числом (тобто послідовністю з однієї або більше цифр) на слово "Фото" зі збереженням наступного числа.
Ще один приклад використання регулярних виразів для пошуку послідовності символів. Досить часто виникає завдання пошуку послідовності з великих літер і застосування до неї символьного стилю (зазвичай small caps для створення капітелей). Це завдання так само має дуже просте рішення при використанні GREP. Рядок пошуку: \ u \ u +, рядок заміни в даному випадку потрібно залишити порожній (так як міняти ми будемо тільки форматування), а в полі Change Format потрібно вказати символьний стиль який ми хочемо застосувати до результату пошуку. Метасимвол \ u в даному прикладі означає все прописні букви, знак + як і попередньому прикладі означає (один або кілька), таким чином наш пошуковий запит знайде послідовність мінімум з двох великих літер.
Інша сильна сторона GREP - використання альтернатив. Наприклад щоб знайти слова "слон" і "клон" можна використовувати вираз (з | к) лон. Розширена версія цього виразу - (з | к) лони? може бути використана для пошуку форми множини (в результаті будуть знайдені слова "слон", "клон", "слони", "клони"). Знак питання в даному виразі означає, що буква "и" може бути присутнім на кінці слова, а може й не бути. Ще один приклад простого, але водночас потужного вираження - д [аоуеіиеюя] м. Цей вираз відповідає такій послідовності: буква "д", потім голосна, потім буква "м". Ця послідовність може бути як окремим словом (будинок, дим), так і зустрічатися всередині довшого слова (задуматися, диміти). Надалі ми розглянемо як здійснювати пошук тільки за словами цілком. Цей приклад так само демонструє як визначити свої власні шаблони, в даному випадку шаблон для голосних букв.
У комп'ютерному жаргоні "wildcards" означає символ використовується для заміщення одного або декількох інших символів. Російська локалізація InDesign CS3 пропонує нам варіант перекладу - "групові символи". Будемо використовувати термін "шаблон" так як він коротше :-)
Шаблони (Wildcards) - одна з основине функцій GREP. Більшість з них перераховані в Пукто Wildcards випадающго меню поруч з рядком пошуку. Решта перебувають в двох пунктах меню: Quotation Marks і Posix.
Нарешті, свої власні шаблони можна створювати через визначення символьних класів. Розглянемо які шаблони і як ми можемо використовувати.
1. Будь-який символ.
Як випливає з назви цього шаблону відповідає будь-який символ (в звичайному текстовому пошуку для цього використовується шаблон ^?). Символ цього шаблону - точка. Якщо вказати точку в рядку пошуку і натиснути "Find", то по черзі будуть знайдені всі символи в тексті (за винятком символу нового абзацу). Шаблон будь-якого символу можна використовувати в поєднанні з іншими символами або шаблонами. Наприклад, результатом пошукового запиту "д..а" будуть всі слова з чотирьох букв починаються на д і закінчуються на а.
2. Будь-яка велика літера.
Шаблон \ u дозволяє знайти в тексті заголовні букви. Тобто всі символи Unicode які можуть бути інтерпретовані як заголовні букви, такі як заголовні букви латинського алфавіту (в тому числі і з діактріческімі знаками), заголовні літери кириличного алфавіту, івриту, а також арабські. Приклад - \ u \ u + для пошуку абревіатур. Даний запит читається так: "знайти велику літеру (\ u) плюс ще хоча б одну наступну за нею велику літеру" (оператор повторення + буде розглянуто пізніше).
Точка і зворотний слеш.
Точка в GREP є шаблоном будь-якого символу. А що якщо нам потрібно знайти точку в тексті, або символ зворотного слеша? Для цього в пошуковому запиті використовується "екранування" символом зворотного слеша (\). Пошуковий запит для точки виглядає наступним чином - \.
3. Будь-яка мала літера.
Для пошуку малих літер використовується шаблон \ l (рядкова L). Як і в разі вживання великої літери, результатом пошуку буду все символи Unicode, які можна інтерпретувати як малі літери. Наприклад, результатом пошукового запиту \ u \ l + будуть все слова починаються з великої літери.
4. Будь-яка буква.
Знаходить будь-яку букву, не роблячи відмінностей між малими та великими. [\ L \ u] насправді не шаблон, а символьний клас об'єднує два шаблони \ l і \ u.
5. Будь-яка цифра.
\ D - шаблон для пошуку цифр від 0 до 9. У поєднанні з оператором повторення (\ d +) дозволяє знайти всі числа в тексті. Так само цього шаблону відповідають все стилістично змінені цифри: ступеня, чисельники і знаменники, а також дробу, створені функцією Fraction з панелі Character. Дробу введені з використанням значення Unicode (наприклад ¼ - 00BC) цього шаблону не відповідають (вони відповідають тільки шаблоном "будь-який символ").