Обратные ссылки

Наверх  Предыдущий  Следующий

За пределами класса символов, символ обратной косой черты "\" за которым следует цифра больше 0 (и, возможно, дальнейшие цифры) является обратной ссылкой на предшествующий подшаблон с таким порядковым номером. При условии, конечно, что подшаблон с таким номером он существует. Подсчет подшаблонов ведется по открывающимся круглым скобкам.

 

Если десятичное число после символа обратной косой черты меньше 10, то такая последовательность всегда рассматривается как обратная ссылка. Причем ошибкой является только случай, когда количество подшаблонов во всем шаблоне меньше чем указанное число. Другими словами, если ссылка меньше 10, то подшаблон не обязательно должен находится слева от ссылки.

 

Обратная ссылка совпадает только с подстрокой захваченной из текущей исходной строки, а не с самим подшаблоном. Так, шаблон

(sens|respons)e and \1ibility

совпадет со строками "sense and sensibility" и "response and responsibility", но не со строкой "sense and responsibility". Если во время действия обратной ссылки сравнение производится с учетом регистра, то регистр букв имеет значение. К примеру,

((?i)rah)\s+\1

совпадет с "rah rah" и "RAH RAH", но не с "RAH rah", хотя сам подшаблон сравнивается без учета регистра.

 

Может быть более одной обратной ссылки на один и тот же подшаблон. Если подшаблон не был использован в текущем сравнении, то обратная ссылка на него всегда даст несовпадение. К примеру, шаблон

(a|(bc))\2

всегда даст несовпадение, если сравнение началось с "a", а не с "bc". Так как может быть до 99 обратных ссылок, все цифры после символа обратной косой черты воспринимаются как часть номера возможной обратной ссылки. Если шаблон продолжается символом, являющимся цифрой, нужно использовать какой-то разделитель для завершения обратной ссылки. Если установлена опция PCRE_EXTENDED, то этим символом может быть "пробельный" символ. В противном случае можно использовать пустой комментарий.

 

Обратная ссылка внутри подшаблона, на который она ссылается, не совпадет при первом использовании подшаблона. То есть, к примеру, шаблон (a\1) никогда не даст совпадения. Тем не менее, такие ссылки могут быть полезны внутри повторяющихся подшаблонов. К примеру, шаблон

(a|b\1)+

совпадет с любым количеством букв "a", а также со строками "aba", "ababaa" и т.д. В каждой итерации подшаблона обратная ссылка совпадет со строкой символов из предыдущей итерации. Для того, чтобы это работало, шаблон должен быть таким, что в первой итерации не требуется совпадение с обратной ссылкой. Это может быть достигнуто с использование альтернатив, как в предыдущем примере, либо при помощи квантификатора с минимальным количеством повторений равным 0.