"Дмитрий Леонов. Использование Perl в интернет-технологиях" - читать интересную книгу автора


В приведенных примерах мы использовали простейший образец, состоящий из
последовательности обычных символов. Однако возможны и более сложные
комбинации. Самый простой символ сопоставления - точка ("."). Она
соответствует любому одиночному символу, кроме символа новой строки. Можно
задать класс символов сопоставления с помощью списка, заключенного в
квадратные скобки:
/[абвгде]/;
Этому образцу соответствует строка, содержащая один из этих шести
символов. Диапазон символов задается с помощью дефиса (сам дефис вставляет в
список как \-), символ "^", стоящий сразу за открывающей скобкой, означает
отрицание - такому классу символов соответствует любой символ,
отсутствующий в этом списке. Некоторые распространенные классы символов
имеют предопределенные обозначения:
\d [0-9] цифра
\w [a-zA-Z0-9_] обычный символ
\s [ \r\t\n\f] пробельный символ
\D [^0-9] нецифровой символ
\W [^a-zA-Z0-9_] специальный символ
\S [^ \r\t\n\f] непробельный символ

Однако самое интересное начинается при работе с образцами для групп
символов, или множителями. Два основных образца здесь - звездочка "*" и
плюс "+". Звездочке соответствует ни одного или более экземпляров стоящего
перед ней символа или класса символов, плюсу - один или более экземпляров.
Образцу "?" соответствует ни одного или один символ, стоящий перед ним в
шаблоне, наконец, с помощью фигурных скобок можно задать точное количество
повторений этого символа, или диапазон.
/ab*/; # строки, содержащие а, ab, abb, abbb и т.д.
/ab+/; # ab, abb, abbb и т.д.
/ab?/; # а, ab
/ab{2}/; # abb
/ab{2,4}/; # abb, abbb, abbbb
/ab{2,}/; # abb, abbb, abbbb и т.д.

Поиск по шаблону с множителями характеризуется тремя особенностями:
"жадностью", "торопливостью" и возвратом. "Жадность" означает, что если
шаблон может совпасть со строкой в нескольких вариантах, то выбирается самый
длинный:
$s = 'abbbbb';
$s =~ s/a.*b/c/; #результирующая строка будет содержать только "с".
Любой множитель можно превратить из "жадного" в "ленивый", поставив
сразу после него вопросительный знак:
$s = 'abbbbb';
$s =~ s/a.*?b/c/; #результирующая строка содержит "cbbbb".
"Торопливость" означает, что механизм поиска стремится обнаружить
совпадение как можно скорее - так, шаблону /a*/ будет соответствовать любая
строка, поскольку * - это 0 или более символов.
Наконец, возврат обеспечивает совпадение со строкой не только части
регулярного выражения, а всего шаблона. Т.е. если начало шаблона совпадает