Шаг 100.
Регулярные выражения. Обратные ссылки

    На этом шаге мы рассмотрим организацию и ипользование обратных ссылок.

    Ранее мы установили, что группу элементов регулярного выражения можно заключить в скобки и рассматривать как один элемент. Заключение группы элементов в скобки имеет дополнительный и весьма полезный эффект. Если в результате поиска будет найден фрагмент текста, соответствующий образцу, заключенному в скобки, то этот фрагмент сохранится в специальной переменной. Внутри регулярного выражения к нему можно будет обратиться, используя запись \number, где number - номер конструкции () в исходном регулярном выражении. Запись \number, указывающую на найденный по образцу фрагмент текста, будем называть обратной ссылкой. Можно задать любое количество конструкций вида () и ссылаться на соответствующие найденные фрагменты текста, как на \1, \2 и т. д. Например, образцу /(.+)-\1/ со ответствуют слова "ха-ха", "хи-хи", "ку-ку" и т. п., а образцу /(.)(.).?\2\1/ - все палиндромы из четырех или пяти букв. (Палиндром - слово или предложение, которое одинаково читается слева направо и справа налево.)

    Внутри образца конструкция \n (n=l, ... , 9) всегда обозначает обратную ссылку. Запись вида \nn также интерпретируется как обратная ссылка, но только в том случае, если в исходном выражении задано не менее, чем nn скобочных конструкций вида (). Иначе запись \nn обозначает символ с восьмеричным кодом nn.

    Для ссылки на найденный фрагмент текста за пределами регулярного выражения, например, при задании замещающего текста в операции замены, вместо записи \number используется запись $number. Например, операция замены

    $str=~s/(\S+)\s+(\S+)/$2  $1/
меняет местами первые два слова в строке $str.

    Область действия переменных $1, $2 и т.д, распространяется до наступления одного из следующих событий:

    Аналогичным образом определяется область действия и для следующих предопределенных переменных, используемых в операциях сопоставления с образцом.

    Например, в результате выполнения операции поиска

    $str=~m/two/
в строке $str="one two three" образца /two/ переменным будут присвоены следующие значения:
    $& - "two";
    $` - "one"; 
    $' - "three".
Эти значения будут сохраняться до наступления одного из перечисленных выше событий, и их можно использовать, например, для формирования строки с обратным порядком следования слов: $rstr=$'.$&.$`. Строка $rstr будет иметь вид "three two one".

    Следует отметить, что, если обращение к одной из переменных $&, $', $` встречается где-либо в программе, то интерпретатор Perl будет вычислять и запоминать их для каждой операции сопоставления с образцом, что, в свою очередь, замедляет выполнение всей программы. Поэтому не следует использовать данные переменные без особой необходимости.

    На следующем шаге мы рассмотрим расширенный синтаксис регулярных выражений.




Предыдущий шаг Содержание Следующий шаг