Resumo : neste tutorial, você aprenderá sobre os quantificadores regex não gananciosos (ou preguiçosos) que correspondem aos seus elementos anteriores o menor número de vezes possível.
Introdução aos quantificadores regex não gananciosos (ou preguiçosos)
Nas expressões regulares , os quantificadores possuem duas versões: ganancioso e não ganancioso (ou preguiçoso). No tutorial anterior , você aprendeu como funcionam os quantificadores gananciosos .
Para transformar um quantificador ganancioso em um quantificador não ganancioso, você pode anexar um ponto de interrogação ( ?
) a ele. A tabela a seguir mostra os quantificadores gananciosos e não gananciosos:
Quantificador ganancioso | Quantificador preguiçoso | Significado |
---|---|---|
* |
*? |
Combine seu elemento anterior zero ou mais vezes. |
+ |
+? |
Combine seu elemento anterior uma ou mais vezes. |
? |
?? |
Combine seu elemento anterior com zero ou uma vez. |
{ n } |
{ n }? |
Combine seu elemento anterior exatamente n vezes. |
{ n ,} |
{ n ,}? |
Combine seu elemento anterior pelo menos n vezes. |
{ n- , m } |
{ n- , m }? |
Combine seu elemento anterior de n a m vezes. |
O exemplo a seguir usa o quantificador não ganancioso ( +?
) para corresponder ao texto entre aspas ( ""
):
<?php
$str = '<a href="/" title="Go to homepage">Home</a>';
$pattern = '/".+?"/';
if (preg_match_all($pattern, $str, $matches)) {
print_r($matches[0]);
}
Linguagem de código: HTML, XML ( xml )
Saída:
Array
(
[0] => "/"
[1] => "Go to homepage"
)
Linguagem de código: PHP ( php )
Como funciona o quantificador não ganancioso (+?).
Primeiro, o mecanismo regex procura uma correspondência começando na primeira posição da string. Como o mecanismo regex não consegue encontrar uma correspondência, ele continua pesquisando até encontrar a primeira aspa ( "
):
Segundo, o mecanismo regex encontra uma correspondência para a regra .+?
. No entanto, o quantificador não ganancioso +?
corresponde apenas uma vez , e não várias vezes ao final da string, como o quantificador ganancioso ( +
). E o mecanismo regex olha imediatamente para a próxima regra no padrão, que corresponde a uma aspa (“):
Terceiro, o mecanismo regex repete a primeira e a segunda etapas começando na posição após a primeira correspondência e retorna o próximo resultado:
Finalmente, o mecanismo regex continua pesquisando até o final da string:
Resumo
- Anexe um ponto de interrogação (?) a um quantificador para transformá-lo em um quantificador não ganancioso.
- Um quantificador não ganancioso tenta corresponder ao seu elemento anterior o menor número de vezes possível.