Шаблоны
Язык Perl, как и многие другие языки программирования,
имеет возможность в своем контексте применять шаблоны или так называемые
регулярные выражения. Такие представляют собой символ или набор символов
(метасимвол), которые вследствие применения каких-либо действий над
ними, будут являться определенными стандартами в программе. Широкое
применение шаблоны нашли в операторах поиска и операторах связки. Метасимволы в
шаблонах такие:
-
^ - начало строки
-
$
- конец строки
-
\
- переход от метасимвола к символу
-
[ ]
- определение классов символов
-
( )
- группирование (конструкция шаблона)
-
. -
метасимвол, как один произвольный символ (кроме обозначения конца
строки -
"\n")
-
I
- выбор между альтернатив
-
\w
- соответствуют алфавитные и цифровые символы, а также символ
подчерк ( "_")
-
\W - соответствуют все символы не входящие во множество
символов
"w"
-
\s - символы пробела, табуляции, возврата каретки
-
\S - все символы не входящие во множество символов
s
-
\d
- цифровые
символы
-
\D
- нецифровые символы
-
\b
- соответствуют границы слова
и относится к мнимым метасимволам, т.е. является мнимой точкой между
\w и
\W
-
\B
- соответствуют не -границы слова, также мнимый
-
\A
- соответствуют только, как начало строки, является мнимым и служит
аналогией
"^", при условии, что начало строки - это одинаковое значение
для каждой строки в её многострочном аналоге.
-
\Z
- соответствуют только, как конец строки, применяется как предыдущий,
но в отношении к метасимволу
"$".
Примечание: Обратите внимание, что
\w и
\d
отмечают только отдельные символы, а не все слово.
Чтобы отметить все слово нужно использовать модификатор "+" (см. ниже) -
\w+
и
\d+.
Чтобы было более понятно - приведем пример:
if ($string =~ /<title>(.*)<\/title>/i)
, где видно сгруппированный метасимвол "." с его модификатором - "*".
Модификатор имеет место в каждом
метасимволе, использующихся в шаблоне. Они задают значение регулярности
сравнений, поиска и т.д.. Существуют следующие их обозначения:
- * - цикл от
"нуля" и более вхождений
-
+
- аналогичен предыдущему, но
"ноль" - не в счёт
-
?
- только
"ноль" или
"одно" вхождение
-
{n}
- только ровно
"n" вхождений
-
{n,}
- по крайней мере не меньше
"n" вхождений
-
{n,m}
- по крайней мере не меньше
"n", но и не превышало
m-раз.
Примечание:
"*" равен
"{0,}" ,
"+" одинаков с
"{1,}" и
"?"
аналогичен
"{0,1}"
. Ограничение на величину
m и
n - 65536.
Эта стандартная конструкция работает в
`
`жадном''
режиме, иными словами, регулярному выражению
a.*b будет соответствовать
различный набор слов начинающихся с символа
"a" и заканчивавшихся символом
"b"
.
В таких словах существует последовательность символов, которые также
удовлетворяют требованию регулярного выражения языка
Perl. Если после
каждого из описанных метасимволов подставить справа знак "
?
", то подобные метасимволы
будут ограничиваться, т.е. произойдет их уменьшение распространения.
При этом их значения не изменяться.
Шаблоны обрабатываются, как строка
в двойных кавычках, поэтому приведенные ниже интерпретации с символом
"\"
(bakcslash) также будут обработаны компилятором как:
-
\n
- с новой строки
-
\t
- применить табуляцию
-
\v
- применить вертикальную табуляцию
-
\a
- перевести в другой формат
-
\r
- перевести каретку
-
\e
- сделать переход
-
\c
- контролировать символ
-
\033
- восьмеричная обработка символа
-
x1A
- шестнадцатеричная обработка символа
-
\E
- произвести отмену для смены регистра
-
\u
- работать по верхнему регистру
-
\U
- работать по верхнему регистру до команды "
\E
"
-
\l
- работать по нижнему регистру
-
\L
- работать по нижнему регистру до команды "
\E
"
-
\Q
- команда отмены (исключение) метасимвола
При применении конструкции шаблонов, например в "
(...), \<title>
" подставляет
подстроку из скобок с номером
title
. Можно использовать скобки для отделения
подшаблона. Например если в скобках имеется более, чем 12 подстрок, то переменные
$13 , $14 , ... $n содержат соответствующие подстроки. И здесь приходят на
помощь программисту дополнительные переменные:
-
$+
- возвращает то, чему соответствует
последняя конструкция в скобках
-
$&
- возвращает
подставленную строку
-
$`
- возвращает все перед подставленной строкой
-
$'
- возвращает все после подставленной строки
Пример:
$_ = 'abcdefghi';
/def/;
print "$`:$&:$'\n"; # выведет результат, как abc:def:ghi
Если внимательно прочитать
"manual
page"
языка
Perl 5.0, то можно еще встретить такие конструкции регулярных выражений:
- (
?:
шаблон) - как обычная конструкция, но без обратной связи (ссылки)
- (
?=
шаблон) - возможность просмотра результатов раньше, чем логических
вычислений.
- (
?!
шаблон) - как и предыдущий, но логические вычисления -
НЕ
(отрицание)
- (
?#
комментарий) - комментарии в самом шаблоне
-
(?ismx)
- применение в шаблонах встроенных модификаторов
|