Qual é a diferença entre:
(.+?)
e
(.*?)
quando eu uso no meu preg_match
regex php ?
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.*?b
irá 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ãoa(.+?)
,(.+?)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 (.
).fonte
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.fonte
+
corresponde a pelo menos um personagem*
corresponde a qualquer número (incluindo 0) de caracteresO
?
indica uma expressão lenta, portanto, corresponderá ao mínimo de caracteres possível.fonte
Considere abaixo a string para corresponder.
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á
aba
para o padrão(ab.+)
fonte
+
é o mínimo um,*
pode ser zero também.fonte
"+ is minimal one"
O que está frase significa?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.
fonte
Em RegEx,
{i,f}
significa "entrei
af
partidas". 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 4A 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
fonte
Acho que as respostas anteriores não destacam um exemplo simples:
por exemplo, temos uma matriz:
A seguinte expressão regex
^[0-9]+
corresponde a:15
somente. No entanto,^[0-9]*
corresponde a ambos5 and 15
. A diferença é que o+
operador requer pelo menos uma duplicata da expressão regex anteriorfonte