Afirmações
Uma afirmação é um teste nos caracteres posteriores ou anteriores ao ponto atual de correspondência que efetivamente não consome nenhum caractere. As afirmações simples codificadas como \b, \B, \A, \Z, \z, ^ e $ estão descritas na seção sobre sequências de escape. Afirmações mais complexas são codificadas como sub-expressões. Existem dois tipos: aquelas que olham para frente da posição atual na string de entrada e aquelas que olham para trás dela.
Uma sub-expressão de afirmação é correspondida da maneira usual, exceto
que ela não faz com que a posição atual de correspondência seja
alterada. Afirmações que olham para frente iniciam com (?= para afirmações
positivas e com (?! para afirmações negativas. Por exemplo,
\w+(?=;)
corresponde a uma palavra seguida por ponto-e-vírgula, mas não inclui
o ponto-e-vírgula na correspondência, e
foo(?!bar)
corresponde a qualquer ocorrência de "foo" que não seja seguida por
"bar". Observe que a expressão aparentemente similar
(?!foo)bar
não encontra uma ocorrência de "bar" que seja precedida por
algo além de "foo"; ela encontra qualquer ocorrência de "bar"
de todo modo, porque a afirmação (?!foo) é sempre verdadeira
quando os três próximos caracteres são "bar". Uma afirmação que
olha para trás é necessária para conseguir este efeito.
Afirmações que olham para trás iniciam com (?<= para afirmações positivas
e (?<! para afirmações negativas. Por exemplo,
(?<!foo)bar
encontra uma ocorrência de "bar" que não seja precedida por
"foo". O conteúdo de uma afirmação que olha para trás é restrito
de modo que todas as strings às quais ela corresponde precisam ter um comprimento
fixo. No entanto, se houver várias alternativas elas não
precisam ter todas o mesmo comprimento fixo. Assim,
(?<=bullock|donkey)
é permitido, mas
(?<!dogs?|cats?)
causa um erro no momento da compilação. Ramos que correspondem a strings
de comprimento diferente são permitidas somente no nível mais alto de
uma afirmação que olha para trás. Isto é uma extensão quando comparado com
o Perl 5.005, que requer que todos os ramos correspondam ao mesmo
comprimento de string. Uma afirmação como
(?<=ab(c|de))
não é permitida, porque seu ramo único no nível mais alto pode
corresponder a dois comprimentos diferentes, mas é aceitável se for re-escrita
para usar dois ramos no nível mais alto:
(?<=abc|abde)
A implementação de afirmações que olham para trás é, para cada
alternativa, mover temporariamente a posição atual para trás
pela largura fixa e então tentar a correspodência. Se houver
caracteres insuficientes antes da posição atual, a
correspondência falhará. Afirmações que olham para trás em conjunção com
sub-expressões de ocorrência única podem ser particularmente úteis para ter correspondência
nos finais de strings; um exemplo é mostrado no final
da seção sobre sub-expressões de ocorrência única.
Várias afirmações (de qualquer tipo) podem ocorrer sucessivamente.
Por exemplo,
(?<=\d{3})(?<!999)foo
corresponde a "foo" precedida por três dígitos que não são "999".
Note que cada afirmação é aplicada independentemente
no mesmo ponto da string de entrada. Primeiro é
verificado se os três caracteres anteriores são todos dígitos
e depois é verificado se os mesmos três caracteres não são
"999". Esta expressão não corresponde a "foo" precedida por seis
caracteres, os primeiros três dos quais são dígitos e os últimos três
deles não são "999". Por exemplo, ela não corresponde a
"123abcfoo". Uma expressão para fazer isso é
(?<=\d{3}...)(?<!999)foo
Agora a primeira afirmação olha para os seis caracteres precedentes, verificando se os primeiros três são dígitos e depois a segunda afirmação verifica se os três caracteres precedentes não são "999".
Afirmações podem ser aninhadas em qualquer combinação. Por exemplo,
(?<=(?<!foo)bar)baz
corresponde a uma ocorrência de "baz" que é precedida por "bar"
que por sua vez não é precedida por "foo", enquanto que
(?<=\d{3}...(?<!999))foo
é outra expressão que corresponde a "foo" precedida por três
dígitos e quaisquer três caracteres que não sejam "999".
Sub-expressões de afirmação não são sub-expressões de captura, e podem não ser repetidas, porque não faz sentido afirmar a mesmo coisa várias vezes. Se qualquer tipo de afirmação coniver sub-expressões de captura dentro dela, estas são contadas para os propósitos de numeração dos grupos de captura em toda a expressão. Porém, a captura de substring acontece somente para afirmações positivas, porque não faz sentido para afirmações negativas.
Afirmações contam até o máximo de 200 sub-expressões entre parênteses.