Antecipação de Regex

Resumo : neste tutorial, você aprenderá a usar o lookahead regex e o lookahead negativo.

Introdução ao lookahead de regex

Às vezes, você deseja corresponder A, mas apenas se for seguido por B. Por exemplo, suponha que você tenha a seguinte string:

2 chicken weigh 30lbLinguagem de código:  PHP  ( php )

E você deseja combinar o número( 30) seguido pela string lb, não o número 2. Nesse caso, você pode usar o lookahead de regex com a seguinte sintaxe:

A(?=B)Linguagem de código:  PHP  ( php )

O lookahead significa procurar A, mas corresponde apenas se seguido por B. Para um número seguido pela string lb, você pode usar o seguinte padrão:

\d+(?=lb)Linguagem de código:  PHP  ( php )

Neste padrão:

  • \d+corresponder a um ou mais dígitos
  • ?=é o futuro
  • lbcombinar com o texto lb.

O código a seguir usa a sintaxe lookahead regex para corresponder a um número seguido pelo texto lb:

<?php

$pattern = '/\d+(?=lb)/';
$str = '2 chicken weigh 30lb';

if (preg_match($pattern, $str, $matches)) {
    print_r($matches); // 30

}Linguagem de código:  PHP  ( php )

Saída:

Array
(
    [0] => 30
)Linguagem de código:  PHP  ( php )

A seguinte expressão regular também corresponde 30seguida imediatamente por lb:

'/\d+(?=lb)/'Linguagem de código:  PHP  ( php )

Por exemplo:

<?php

$pattern = '/\d+(?=lb)/';
$str = '2 chicken weigh 30lb';

if (preg_match($pattern, $str, $matches)) {
    print_r($matches); // 30

}Linguagem de código:  PHP  ( php )

Saída:

Array
(
    [0] => 30
)Linguagem de código:  PHP  ( php )

Várias antecipações

O seguinte ilustra as múltiplas antecipações:

 A(?=B)(?=C)Linguagem de código:  PHP  ( php )

Funciona assim:

  1. Encontre um
  2. Teste se B está imediatamente depois de A e pule se não estiver.
  3. Teste se C também está imediatamente depois de B; pule se não for.
  4. Se ambos os testes forem aprovados, o A é compatível; caso contrário, procure a próxima correspondência.

Em suma, o A(?=B)(?=C)padrão corresponde Aseguido Be Csimultaneamente.

Antevisão Negativa

Suponha que você queira corresponder apenas o número 2no texto a seguir, mas não o número 30:

2 chicken weigh 30lbLinguagem de código:  PHP  ( php )

Para fazer isso, você pode usar a sintaxe de lookahead negativo:

A(?!B)Linguagem de código:  PHP  ( php )

As A(?!B)correspondências Asomente se seguidas por B. É o \d+não seguido pela string lb:

<?php

$pattern = '/\d+(?!lb)/';
$str = '2 chicken weigh 30lb';

if (preg_match($pattern, $str, $matches)) {
    print_r($matches); // 2

}Linguagem de código:  PHP  ( php )

Saída:

Array
(
    [0] => 2
)Linguagem de código:  PHP  ( php )

Resumo

  • Use o lookahead de regex A(?=B)que corresponde Asomente se seguido por B.
  • Use o lookahead de regex negativo A(?!B)que corresponde Aapenas se não for seguido por B.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *