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". Uma afirmação que olha para trás pode corresponder a strings de tamanhos variáveis, até um limite definido pela implementação. Alternativas de tamanhos diferentes como (?<!dogs?|cats?) e ramos de nível superior que podem corresponder a mais que um comprimento como (?<=ab(c|de)) são permitidos. 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.

Antes do PHP 8.4.0, que inclui o PCRE2 10.44, o conteúdo de uma afirmação que olha para trás era restrito de forma que todas as strings que ela correspondia tinham que ter um comprimento fixo. Se houvessem várias alternativas, nem todas elas precisavam ter o mesmo comprimento fixo, então (?<=bullock|donkey) era permitido, mas (?<!dogs?|cats?) causava um erro no momento da compilação. Ramos que correspondiam a strings de diferentes comprimentos eram permitidas somente no nível superior de uma afirmação que olha para trás. Isto era uma extensão comparado com o Perl 5.005, que requeria que todos os ramos correspondessem o mesmo comprimento de string. Um afirmação como (?<=ab(c|de)) não era permitida porque seu ramo superior único poderia corresponder a dois comprimentos diferentes mas era aceita se fosse reescrita para usar dois ramos de nível superior: (?<=abc|abde)

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.

adicionar nota

Notas de Usuários

Não há notas de usuários para esta página.