≪
≫

Предисловие

Язык Perl был разработан специально для обработки текстов, извлечения из них нужных частей, их форматирования и составления из них новых текстов. Важную роль в этом деле играют регулярные выражения, которые в Perl достигли высокой степени оптимизации и развития. Но многие web-мастера и даже опытные программисты, работающие на этом языке, используют регулярные выражения на простейшем уровне и не получают всех выгод от их мощи. Данный курс предназначен для заполнения этих пробелов в знаниях, он призван научить мыслить категориями регулярных выражений, строить эффективные регулярные выражения и решать с их помощью практические вопросы. Одновременно этот курс будет являться довольно полной справкой по регулярным выражениям Perl.

Лекция 1. Создание регулярных выражений

В лекции дается начальное знакомство с регулярными выражениями: одиночные символы, классы символов, альтернативные шаблоны, квантификаторы (числители), их «жадность» и ее ограничение, мнимые символы (якоря), захватывающие скобки и ссылки на найденный текст.

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

Общее знакомство с регулярными выражениями

Если на компьютере у читателя еще не установлена система программирования Perl, то самое время это сделать. Дистрибутив Perl под Windows можно скачать с сайта www.activestate.com. Это все дается бесплатно. Поставка осуществляется в дистрибутиве MSI (MicroSoft Installer). Вы можете запустить его, найдя этот файл через «Мой компьютер» и дважды щелкнув на нем. Также можно использовать инсталлятор msiexec.exe, находящийся в подкаталоге system32 каталога Windows. Если запустить его без параметров, он в окне выдаст справку на русском языке.

Регулярные выражения обычно используются как операнды операторов поиска /и/.../и замены s/..Слово регулярные означает «составленные по правилам». То, что стоит вместо многоточия в операторе m и вместо первого многоточия в операторе 5, — это и есть регулярное выражение. Буква т означает match (соответствие), а буква 5 означает search (поиск).

Предположим, в программе проверяется ввод пользователя, чтобы выяснить, хочет ли он завершить программу, введя слова slop, quit, exit или abort. Без регулярных выражений вам пришлось бы использовать ряд сравнений с этими образцами, предварительно преобразовав ввод к нижнему регистру. С оператором т эта проверка делается просто:

if ($input =~ rn/stop|quit |exit |abort/i) { exit }

Вы можете также проверить, что пользователь кроме ключевого слова больше ничего не вводил. Для этого оператор т надо записать так: if (Sinput =~ m/~(stop|quit|exit|abort)$/i) { exit }

Мы предполагаем, что ввод пользователя содержится в переменной Sinput. Символы «=~» надо рассматривать как единый символ, это оператор связывания переменной Sinput с данным оператором in. Этот оператор связывания возвратит число /. если оператор поиска т найдет в Sinput текст, соотнесенный с шаблоном, иначе вернется пустая строка, которая в Perl трактуется как ложь. Поэтому оператор поиска удобно использовать в условных операторах и заголовках операторов цикла.

Символы «/» не принадлежат к регулярному, выражению, а лишь ограничивают его подобно скобкам. Транслятор по ним определяет, где начинается и заканчивается регулярное выражение, которое может быть очень большим и сложным. Если символ-ограничитель используется в любом месте регулярного выражения, то он должен быть замаскирован обратным слэшем: V- Эт° может порождать частокол из обратных и прямых слэшей внутри регулярного выражения, что часто встречается у новичков. Синаксис Perl позволяет выбирать в качестве ограничителей почти любые символы, кроме алфавитно-цифровых и пробельных: и т.д. Например, оператор print ' =- m:abc:def:; напечатает единицу. Символы-ограничи

тели лучше выбирать по возможности такими, которые не встречаются в регулярном выражении, чтобы не усложнять его вид. Также лучше не использовать символы «*, +, 1, {,}», потому что в регулярном выра

жении они играют особую роль.

Символы-ограничители могут быть парными: это все виды скобок — (), <>, || и {}. Имеются в виду символы ASCII, т.к. существуют угловые скобки, не принадлежащие к 7-битным символам. В этом случае перед регулярным выражением ставится открывающая скобка, а после него — закрывающая.

Если в качестве ограничителей выступают слэши «/», то букву /и можно не писать. Здесь еще следует добавить, что если ограничителями выступают вопросительные знаки, то букву т также можно не ставить, но эти ограничители включают довольно экзотический режим поиска, который относится к «подозрительным» экспериментам и может не войти в будущие версии Perl.

Если в качестве целевого текста для оператора поиска или замены выступает переменная 5_, то ее можно опустить вместе со связкой =~:

if (/stop|quit|exit|abort/i) { exit }

Буква і после завершителя регулярного выражения называется модификатором и включает режим поиска без учета регистра букв (case

Insensitive). При этом шаблон /SfOp/і будет соответствовать целевой строке ‘stop’, ‘sTOp’ и т. д.

Понятие буквы зависит от локальных установок среды выполнения программы. В русской Windows к буквам также будут относиться все русские буквы в кодировке Windows. Во французской Windows результаты будут другими. Существуют специальные директивы и операторы установки локали (use locale и setlocale), но аргумент setlocale может отличаться для разных операционных систем. Как установить локаль в Perl на сервере. надо уточнять у его администратора.

 
Посмотреть оригинал