Referências retroativas
Fora de uma classe de caracteres, uma barra invertida seguida por um dígito
maior que 0 (e possivelmente dígitos adicionais) é uma referência
retroativa a um grupo de captura realizada anteriormente (isto é, à sua
esquerda) na expressão, desde que tenha havido previamente essa quantidade
de captura entre parênteses.
Porém, se um número decimal seguindo a barra invertida for
menor que 10, ele sempre será interpretado como uma referência retroativa e
causará um erro somente se não tiver havido essa quantidade de
grupos de captura em toda a expressão. Em outras palavras, os
parênteses que são referenciados não precisam estar à esquerda da
referência para números menores que 10.
Uma "referência retroativa à frente" pode fazer sentido quando uma repetição
está envolvida e a sub-expressão à direita tenha participado
de uma iteração anterior. Consulte a seção sobre
sequências de escape para detalhes adicionais da manipulação
de dígitos que seguem uma barra invertida.
Uma referência retroativa corresponde a qualquer coisa que verdadeiramente correspondeu à sub-expressão
de captura na string de entrada atual, e não
a qualquer coisa que corresponda à sub-expressão em si. Portanto, a expressão
(sens|respons)e and \1ibility
corresponde a "sense and sensibility" e "response and responsibility",
mas não a "sense and responsibility". Se a correspondência for sensível a
maiúsculas/minúsculas no momento da referência retroativa, a forma
das letras será relevante. Por exemplo,
((?i)rah)\s+\1
corresponde a "rah rah" e "RAH RAH", mas não a "RAH rah", embora
a sub-expressão de captura original seja correspondida
de forma insensível a maiúsculas/minúsculas.
Pode haver mais que uma referência retroativa à mesma sub-expressão.
Se uma sub-expressão não tiver sido usada em uma correspondência
em particular, qualquer referência retroativa a ela sempre
falhará. Por exemplo, a expressão
(a|(bc))\2
sempre falhará se ele iniciar correspondendo a "a" ao invés de "bc".
Como podem haver até 99 referências retroativas, todos os dígitos
seguindo a barra invertida são consideradas como parte de um potencial número
de identificador de referência retroativa. Se a expressão continua com um caractere de
dígito, algum delimitador precisa ser usado para terminar a
referência retroativa. Se a opção PCRE_EXTENDED
estiver definida, o delimitador pode ser um espaço em branco. Caso contrário um comentário vazio pode ser usado.
Uma referência retroativa que ocorre dentro dos parênteses aos quais ela
se refere falha quando a sub-expressão é usada pela primeira vez, portanto, por
exemplo, (a\1) nunca será correspondida. No entanto, tais referências podem
ser úteis dentro de sub-expressões repetidas. Por exemplo, a expressão
(a|b\1)+
corresponde a qualquer número de "a"s e também a "aba", "ababba" etc. A
cada iteração da sub-expressão, a referência retroativa corresponde
à string de caracteres relativa à iteração anterior.
Para que isso funcione, a expressão precisa ser tal
que a primeira iteração não precise corresponder à referência
retroativa. Isto pode ser feito usando alternância, como no
exemplo acima, ou por um quantificador com um mínimo de zero.
A sequência de escape \g
pode ser
usada para referências absolutas e relativas de sub-expressões.
Esta sequência de escape precisa ser seguida por um número sem sinal ou
negativo, opcionalmente envolvido por chaves. As sequências \1
,
\g1
e \g{1}
são sinônimos
entre si. O uso desta expressão com um número sem sinal pode
ajudar a remover a ambiguidade inerente ao usar dígitos após uma
barra invertida. A sequência ajuda a distinguir referências de caracteres
octais e também torna mais fácil ter uma referência seguida
por um número literal, ex.: \g{2}1
.
O uso da sequência \g
com um número negativo
significa uma referência relativa. Por exemplo, (foo)(bar)\g{-1}
corresponderia à sequência "foobarbar" e (foo)(bar)\g{-2}
corresponderia a "foobarfoo". Isto pode ser útil em expressões longas como uma alternativa
para manter rastreamento do número de sub-expressões para referenciar
uma sub-expressão anterior específica.
Referências às sub-expressões nomeadas podem ser obtidas com
(?P=nome)
,
\k<nome>
, \k'nome'
,
\k{nome}
, \g{nome}
,
\g<nome>
ou \g'nome'
.