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.