## 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 `true` 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.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open