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 30lb
Linguagem 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 futurolb
combinar com o textolb
.
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 30
seguida 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:
- Encontre um
- Teste se B está imediatamente depois de A e pule se não estiver.
- Teste se C também está imediatamente depois de B; pule se não for.
- 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 A
seguido B
e C
simultaneamente.
Antevisão Negativa
Suponha que você queira corresponder apenas o número 2
no texto a seguir, mas não o número 30
:
2 chicken weigh 30lb
Linguagem 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 A
somente 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 correspondeA
somente se seguido porB
. - Use o lookahead de regex negativo
A(?!B)
que correspondeA
apenas se não for seguido porB
.