Регулярные выражения
Атомы
Из всех метасимволов, перечисленных в начале раздела, нам осталось рассмотреть "(" и "). Эти метасимволы служат для группирования ряда элементов, входящих в состав образца, в один элемент. Например, образцу /<abc)+/ соответствует строка, состоящая из одного или более повторений последовательности abc, в то время, как образцу /abc+/ – строка, состоящая из начальных символов аb, за которыми следует один или более символов с.
Теперь мы можем перечислить "атомы", из которых строится регулярное выражение.
- Регулярное выражение в скобках, представляющее несколько элементов, сгруппированных в один.
- Любой обычный символ (не метасимвол).
- Символ ".", представляющий любой одиночный символ, кроме символа новой строки.
- Конструкция […], представляющая класс символов, перечисленных в квадратных скобках.
- Метапоследовательность, представляющая символ или класс символов: \&, \n, \r, \t, \f, \e, \d, \D, \w, \w, \s, \s.
- Метапоследовательность вида \nnn, определяющая символ при помощи его восьмеричного ASCII-кода nnn
- Метапоследовательность вида \хnn, определяющая (символ при помощи его шестнадцатеричного ASCII-кода nn.
- Метапоследовательность вида \сn, представляющая управляющий символ ctri-n.
- Конструкция вида \number, представляющая обратную ссылку.
- Любая конструкция вида \character, не имеющая специального значения, а представляющая собственно символ character, например: \*, \ у , \ь.
- Напомним, что в регулярном выражении множители *, +,?, {n,m} применяются именно к атому, расположенному непосредственно слева.
Обратные ссылки
Ранее мы установили, что группу элементов регулярного выражения можно заключить в скобки и рассматривать как один элемент. Заключение группы элементов в скобки имеет дополнительный и весьма полезный эффект. Если в результате поиска будет найден фрагмент текста, соответствующий образцу, заключенному в скобки, то этот фрагмент сохранится в специальной переменной. Внутри регулярного выражения к нему можно будет обратиться, используя запись \number, где number-номер конструкции () в исходном регулярном выражении. Запись \number, указывающую на найденный по образцу фрагмент текста, будем называть обратной ссылкой. Можно задать любое количество конструкций вида () и ссылаться на соответствующие найденные фрагменты текста, как на \i, \2 и т. д. Например, образцу /(. +) – \1/ соответствуют слова "ха-ха", "хи-хи", "ку-ку" и т. п., а образцу /{.)(.).?\2\1/ – все палиндромы из четырех или пяти букв. (Палиндром – слово или предложение, которое одинаково читается слева направо и справа налево.)
Внутри образца конструкция \n (n=i,…,9) всегда обозначает обратную ссылку. Запись вида \пп также интерпретируется как обратная ссылка, но только в том случае, если в исходном выражении задано не менее, чем пп скобочных конструкций вида (). Иначе запись \пп обозначает символ с восьмеричным кодом nn.
Для ссылки на найденный фрагмент текста за пределами регулярного выражения, например, при задании замещающего текста в операции замены, вместо записи \number используется запись $пшпЬег. Например, операция замены:
$str=~s/(\S+)\s+(\S+)/$2 $1/
…меняет местами первые два слова в строке $str.
Область действия переменных $1, $2 и т. д, распространяется до наступления одного из следующих событий: конец текущего блока; конец строки, являющейся аргументом функции evai; следующее совпадение с образцом. Аналогичным образом определяется область действия и для следующих предопределенных переменных, используемых в операциях сопоставления с образцом.
- $& – часть строки, найденная при последней операции сопоставления с образцом.
- $' – часть строки, стоящая перед совпавшей частью при последней успешной операции сопоставления с образцом.
- $' – часть строки, стоящая после совпавшей части при последней успешной операции сопоставления с образцом.
Например, в результате выполнения операции поиска:
$str=~m/two/
…в строке $str="one two three" образца /two/ переменным будут присвоены следующие значения:
$& – "two"; $* – "one"; $' – "three".
Эти значения будут сохраняться до наступления одного из перечисленных выше событий, и их можно использовать, например, для формирования строки с обратным порядком следования слов: $rstr=$'.$&.$". Строка $rstr будет иметь ВИД "three two one".
Следует отметить, что, если обращение к одной из переменных $&, $', $ встречается где-либо в программе, то интерпретатор peri будет вычислять и запоминать их для каждой операции сопоставления с образцом, что, в свою очередь, замедляет выполнение всей программы. Поэтому не следует использовать данные переменные без особой необходимости.