Регулярные выражения, 3-е издание

Регулярные выражения, 3-е издание
Автор: Джеффри Фридл
Год: 2008
ISBN: 978-5-93286-121-9
Страниц: 598
Язык: Русский
Формат: PDF
Размер: 10 Мб

Download

Книга Джеффри Фридла «Регулярные выражения» откроет перед вами секрет высокой производительности. Тщательно продуманные регулярные выражения помогут избежать долгих часов утомительной работы и решить свои проблемы за 15 секунд. Ставшие стандартной возможностью во многих языках программирования и популярных программных продуктах, включая Perl, PHP, Java, Python, Ruby, MySQL, VB.NET, C# (и других языках платформы .NET), регулярные выражения позволят вам автоматизировать сложную и тонкую обработку текста.
В третье издание включена информация о PHP и его мощном механизме регулярных выражений. Кроме того, обновлены и дополнены сведения о других языках программирования, включая расширенное и углубленное описание пакета java.util.regex компании Sun, при этом особое внимание уделено различиям между Java 1.4.2 и Java 1.5/1.6.
Написанное простым и доступным языком, это издание позволит программистам легко разобраться в столь сложной теме. Рассматривается принцип действия механизма регулярных выражений, сравниваются функциональные возможности различных языков программирования и инструментальных средств, подробно обсуждается оптимизация, которая дает основную экономию времени! Вы научитесь правильно конструировать регулярные выражения для самых разных ситуаций, а большое число сложных примеров даст возможность сразу же использовать предлагаемые ответы для выработки элегантных и экономичных практических решений широкого круга проблем.
Последние главы книги посвящены конкретным языкам программирования. Кроме того, автор демонстрирует наиболее распространенные ошибки и показывает, как их избежать.

+

Задание соответствия цифрам с помощью символьных классов

Что если вы хотите найти в телефонном номере все цифры за один раз? Иными словами, как задать соответствие каждой из цифр номера, не прибегая к последовательному перебору конкретных значений?

Вновь введите в верхнем поле следующую строку в том виде, как она приведена:

В результате все числа (точнее, цифры) в нижнем поле выделятся попеременно желтым и голубым цветом. Выражение [0-9] означает для процессора регулярных выражений следующее: “Найти совпадение с любой цифрой, принадлежащей к диапазону 0-9”.

Квадратные скобки не участвуют в сопоставлении литералов регулярного выражения с целевыми строками, поскольку обрабатываются особым образом как метасимволы. Метасимволы имеют специальный смысл в регулярных выражениях и представляют зарезервированные значения. Последовательность символов, заключенная в квадратные скобки, называется символьным классом (или символьным набором). Символьному классу соответствует любой одиночный символ из числа тех, которые заключены в квадратные скобки.

Можно более точно ограничить набор допустимых цифр, указав их конкретный список:

Введите это регулярное выражение в верхнем текстовом поле. Ему будут соответствовать не любые цифры, а только те, которые входят в список, т.е. 0, 1, 2, 7, 8 и 9. И вновь в нижнем поле чередующимися цветами будут выделены все цифры номера.

Для представления любого десятизначного телефонного номера, отдельные группы цифр которого разделены дефисами, можно было бы использовать следующее выражение:

Это регулярное выражение вполне функционально, но чересчур громоздко. Гораздо более элегантное решение данной задачи обеспечивают символьные сокращения.

Использование символьных сокращений

Еще один способ представления произвольной одиночной цифры, с которым вы уже успели ознакомиться в начале главы, заключается в использовании метасимвола \d, которому, как и регулярному выражению [0-9], соответствует любая арабская цифра. Регулярные выражения подобного типа, обеспечивающие компактную форму записи целых классов символов, называют символьными сокращениями или просто сокращениями. (Для них существует также другое название — символьные маски, но, поскольку последний термин может вносить некоторую путаницу, я избегаю его использования. Более подробные объяснения будут даны немного позже.)

В качестве регулярного выражения, совпадающего с любым телефонным номером, представленным в описанном ранее формате, можно было бы использовать следующее выражение:

Повторение последовательности символов \d три или четыре раза подряд в точности соответствует группам, состоящим из трех или четырех следующих подряд цифр. Дефис используется здесь как литеральный символ, участвующий в сопоставлении шаблона с целевым текстом.

Включение дефисов в регулярное выражение — не единственный способ сопоставления с дефисами в телефонном номере. Для этой цели можно также использовать экранированный символ D в верхнем регистре (\D), которому соответствует любой символ, не являющийся цифрой.

Вот как можно использовать сокращение \D вместо литерального дефиса:

Можете проверить, что и в этом случае в нижнем текстовом поле выделится весь телефонный номер, включая дефисы.

Приложения со встроенным механизмом регулярных выражений

В завершение главы упомяну о некоторых приложениях, в которых предусмотрена поддержка регулярных выражений.

Text Mate — текстовый редактор, доступный только для компьютеров Мае, в котором используется та же библиотека регулярных выражений, что и в языке программирования Ruby. Для работы с регулярными выражениями используйте средство Find (Найти). Проследите за тем, чтобы был установлен флажок Regular expression (Регулярное выражение).

Благодаря чему регулярные выражения способны обеспечивать многовариантные решения? Одним из факторов, способствующих этому, служит то, что регулярные выражения обладают замечательным свойством — компонуемостью (composability). Когда о языке, будь то формальный язык, язык программирования или язык схем, говорят, что он обладает свойством компонуемости, то под этим подразумевается, что можно не только использовать его отдельные атомарные части, но и комбинировать их всевозможными способами с помощью методов, предоставляемых самим языком. Как только вы научитесь работать с отдельными составными частями регулярных выражений, вы сможете находить соответствия шаблонам любой степени
сложности.

Введите в верхнем поле RegExr выражение [12] и проанализируйте результат. Сокращенная форма записи класса для цифр в виде метасимвола \d короче и проще, но не обладает возможностями и гибкостью символьных классов. С помощью класса можно точно указать, вхождения каких цифр требуется найти. Я использую символьные классы в тех случаях, когда не могу использовать сокращение \d (оно не всегда поддерживается) или когда требуется избирательно указывать цифры, подлежащие сопоставлению. Во всех остальных случаях я использую сокращение \d в силу его простоты и компактности синтаксиса

Соответствие нецифровым символам

Как это свойственно многим символьным сокращениям, определяемые ими закономерности соответствия можно легко обратить (для этого существует технический термин — инверсия). Например, для того чтобы задать сопоставление с символами, не являющимися цифрами, достаточно использовать следующее символьное сокращение…

Преобразование простого текста с помощью Perl

Ниже будет показано, как разметить простой текст тегами HTML с помощью Perl. Как и в случае примеров, в которых использовался редактор sed, сначала будут представлены одиночные команды, и уже после этого мы соберем их в одном командном файле.