Capturando zero ou mais caracteres no regex sem ser ganancioso

1

Para expressões regulares, muitas vezes é desejável fazer parte da expressão não-gananciosa. Para isso, usamos o ponto de interrogação.

Qual é a diferença entre (.*?) e (.*)? quando usado como parte de uma expressão maior para capturar zero ou mais caracteres?

Por exemplo, irá: (.*?)ng já produziu um resultado diferente de (.*)?ng ?

Os resultados finais são os mesmos (confirmados pelo link ), mas existem diferenças que não são tão óbvias?

    
por RockPaperLizard 13.09.2016 / 03:27

1 resposta

0

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.

    
por 18.09.2016 / 22:21

Tags