Regex plus vs diferença de estrelas?

89

Qual é a diferença entre:

(.+?)

e

(.*?)

quando eu uso no meu preg_matchregex php ?

David19801
fonte

Respostas:

146

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

estema
fonte
2
"preguiçoso" é o termo mais comum para "mesquinho"
Walter Tross
O exemplo está incorreto. Ambos (.+?)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.
Louis55 de
Por que a. * B não devolveria "ab"? Não está dizendo "palavra que tem entre aeb, 0 ou mais caracteres", portanto, ab tem zero caractere entre e pode ser uma correspondência. Por que isso está incorreto?
Hello World
@HelloWorld, isso tem a ver com a ganância que expliquei acima. .*corresponderá tanto quanto possível. Se você quiser parar o mais cedo possível, você tem que torná-lo desagradável.*?
estema
22

O primeiro ( +) é um ou mais caracteres . O segundo ( *) é zero ou mais caracteres . Ambos não são gananciosos ( ?) e correspondem a qualquer coisa ( .).

Quentin
fonte
1
Isso depende se o modificador s está definido ou não.
Quentin de
8

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.

DaveRandom
fonte
8

+ 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.

Xophmeister
fonte
8

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
Azri Jamil
fonte
Acho que esta é a melhor resposta especificamente para a pergunta de + vs *
Terrence
6

+é o mínimo um, *pode ser zero também.

Jeroen
fonte
"+ is minimal one"O que está frase significa?
Det
4

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.

Fantasma de madara
fonte
4

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

Miladiouss
fonte
2

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

Crt
fonte