Qual é a diferença entre:
(.+?)
e
(.*?)
quando eu uso no meu preg_matchregex php ?
Qual é a diferença entre:
(.+?)
e
(.*?)
quando eu uso no meu preg_matchregex php ?
Respostas:
Eles são chamados de quantificadores.
* 0 ou mais da expressão anterior
+ 1 ou mais da expressão anterior
Por padrão, um quantificador é ganancioso, o que significa que ele corresponde ao máximo de caracteres possível.
O ?depois que um quantificador muda o comportamento para tornar este quantificador "não consertado", significa que ele corresponderá o mínimo possível.
Exemplo ganancioso / mesquinho
Por exemplo, na string " abab "
a.*b corresponderá a "abab" (preg_match_all retornará uma correspondência, o "abab")
while a.*?birá corresponder apenas ao "ab" inicial (preg_match_all retornará duas correspondências, "ab")
Você pode testar seus regexes online, por exemplo, no Regexr, veja o exemplo ganancioso aqui
(.+?)e (.*?)se comportam de maneira diferente em uma vária posição de expressões regulares que são a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
.*corresponderá tanto quanto possível. Se você quiser parar o mais cedo possível, você tem que torná-lo desagradável.*?
O primeiro ( +) é um ou mais caracteres . O segundo ( *) é zero ou mais caracteres . Ambos não são gananciosos ( ?) e correspondem a qualquer coisa ( .).
A +corresponde a uma ou mais instâncias do padrão anterior. A *corresponde a zero ou mais instâncias do padrão anterior.
Então, basicamente, se você usar um +, deve haver pelo menos uma instância do padrão; se você usar, *ele ainda corresponderá se não houver instâncias dele.
+ corresponde a pelo menos um personagem
* corresponde a qualquer número (incluindo 0) de caracteres
O ?indica uma expressão lenta, portanto, corresponderá ao mínimo de caracteres possível.
Considere abaixo a string para corresponder.
ab
O padrão (ab.*) retornará uma correspondência para o grupo de captura com resultado deab
Enquanto o padrão (ab.+)não corresponderá e não retornará nada.
Mas se você alterar a string para seguinte, ela retornará abapara o padrão(ab.+)
aba
Uma estrela é muito semelhante a um sinal de mais, a única diferença é que, enquanto o sinal de mais corresponde a 1 ou mais do personagem / grupo anterior, o início corresponde a 0 ou mais.
Em RegEx, {i,f}significa "entre ia fpartidas". Vamos dar uma olhada nos seguintes exemplos:
{3,7} significa entre 3 a 7 partidas {,10} significa até 10 correspondências sem limite inferior (ou seja, o limite inferior é 0){3,} significa pelo menos 3 correspondências sem limite superior (ou seja, o limite superior é infinito){,} significa que não há limite superior ou limite inferior para o número de correspondências (ou seja, o limite inferior é 0 e o limite superior é infinito){5} significa exatamente 4 A maioria dos bons idiomas contém abreviações, assim como o RegEx:
+ é a abreviatura para {1,}* é a abreviatura para {,}? é a abreviatura para {,1}Isso significa que +requer pelo menos 1 correspondência, enquanto *aceita qualquer número de correspondências ou nenhuma correspondência e ?não aceita mais de 1 correspondência ou nenhuma correspondência.
Crédito: Codecademy.com
Acho que as respostas anteriores não destacam um exemplo simples:
por exemplo, temos uma matriz:
numbers = [5, 15]
A seguinte expressão regex ^[0-9]+corresponde a: 15somente. No entanto, ^[0-9]*corresponde a ambos 5 and 15. A diferença é que o +operador requer pelo menos uma duplicata da expressão regex anterior