Regex não ganancioso (ou preguiçoso)

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.

Deixe um comentário

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