Como mencionado na minha outra resposta , a versão .*?
é preguiçosa. Isso significa que fará com que a parte entre parênteses se aplique ao mínimo possível para que a regex corresponda. A versão com o ponto de interrogação fora dos parênteses é gulosa: será aplicada ao maior número de caracteres possível.
Ambas as expressões terão o mesmo efeito se você olhar apenas para obter uma correspondência versus não. As duas corridas de curinga receberão uma correspondência se possível , mas uma minimiza a quantidade capturada enquanto a outra maximiza. Eles diferem, no entanto, no que capturam.
Vamos ver um exemplo das diferenças de captura: singing
. Contém o literal ng
duas vezes. Em (.*?)ng
, (.*?)
vai pegar tudo até o primeiro ng
- uma vez visto isso, pronto: é preguiçoso. Ele capturará si
nesse caso. (.*)?ng
tentará capturar o máximo possível - é ganancioso - deixando apenas a% finalng
out. Captura singi
aqui.
A menos que haja várias instâncias da parte fora do curinga na cadeia de entrada, você não verá a diferença.