Não é a correspondência mais curta possível, apenas uma correspondência curta. Modo Greedy tenta encontrar a última correspondência possível, modo preguiçoso a primeira correspondência possível. Mas a primeira correspondência possível não é necessariamente a mais curta.
Pegue a string de entrada foobarbaz
e o regexp o.*a
(greedy) ou o.*?a
(lazy).
A correspondência mais curta possível nesta string de entrada seria oba
.
No entanto, o RegExp procura correspondências da esquerda para a direita, portanto, o o
encontra o primeiro o
em foobarbaz
. E se o resto do padrão produzir uma correspondência, é onde fica.
Após o primeiro o
, .*
(ganancioso) come obarbaz
(a string inteira) e depois retrocede para corresponder ao restante do padrão ( a
). Assim, ele encontra o último a em baz
e acaba combinando com oobarba
.
Após o primeiro o
, .*?
(lazy) não come a string inteira, em vez disso, procura a primeira ocorrência do resto do padrão. Primeiro, ele vê o segundo o
, que não corresponde a a
, depois vê b
, que não corresponde a a
, depois vê a
, que corresponde a a
, e porque é preguiçoso é onde ele pára. (e o resultado é ooba
, mas não oba
)
Portanto, embora não seja O mais curto possível, é mais curto do que a versão gulosa.