Regex plus vs Stern Unterschied?

88

Was ist der Unterschied zwischen:

(.+?)

und

(.*?)

wenn ich es in meinem PHP preg_matchRegex benutze ?

David 19801
quelle

Antworten:

144

Sie werden Quantifizierer genannt.

* 0 oder mehr des vorhergehenden Ausdrucks

+ 1 oder mehr des vorhergehenden Ausdrucks

Standardmäßig ist ein Quantifizierer gierig, dh er entspricht so vielen Zeichen wie möglich.

Die ?nach einer quantifier ändert das Verhalten dieses quantifier zu machen „ungreedy“, bedeutet es , so wenig wie möglich übereinstimmen.

Beispiel gierig / ungreedy

Zum Beispiel auf der Zeichenfolge " abab "

a.*b wird mit "abab" übereinstimmen (preg_match_all gibt eine Übereinstimmung zurück, das "abab")

while a.*?bstimmt nur mit dem Start "ab" überein (preg_match_all gibt zwei Übereinstimmungen zurück, "ab")

Sie können Ihre Regexes online testen, z. B. auf Regexr. Das gierige Beispiel finden Sie hier

Stema
quelle
2
"faul" ist die gebräuchlichste Bezeichnung für "ungreedy"
Walter Tross
Das Beispiel ist falsch. Beide (.+?)und (.*?)verhalten sich anders in einer verschiedenen Position von regulären Ausdrücken , die sind a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
Louis55
Warum sollte a. * B nicht "ab" zurückgeben? Sagt es nicht "Wort, das zwischen a und b 0 oder mehr Zeichen hat", daher hat ab null Zeichen zwischen und könnte eine Übereinstimmung sein. Warum ist das falsch?
Hallo Welt
@HelloWorld, das hat mit der Gier zu tun, die ich oben erklärt habe. .*wird so viel wie möglich übereinstimmen. Wenn Sie so früh wie möglich aufhören möchten, müssen Sie es ungreedy machen.*?
Stema
22

Das erste ( +) besteht aus einem oder mehreren Zeichen . Das zweite ( *) besteht aus null oder mehr Zeichen . Beide sind nicht gierig ( ?) und passen zu allem ( .).

QUentin
quelle
1
Das hängt davon ab, ob der Modifikator s gesetzt ist oder nicht.
Quentin
8

A +entspricht einer oder mehreren Instanzen des vorhergehenden Musters. A *entspricht null oder mehr Instanzen des vorhergehenden Musters.

Wenn Sie also ein verwenden, +muss mindestens eine Instanz des Musters vorhanden sein. Wenn Sie es verwenden *, stimmt es im Grunde immer noch überein, wenn es keine Instanzen davon gibt.

DaveRandom
quelle
8

+ entspricht mindestens einem Zeichen

* Entspricht einer beliebigen Anzahl (einschließlich 0) von Zeichen

Das ?zeigt einen faulen Ausdruck an, sodass so wenige Zeichen wie möglich übereinstimmen.

Xophmeister
quelle
8

Betrachten Sie unten die passende Zeichenfolge.

ab

Das Muster (ab.*)gibt eine Übereinstimmung für die Erfassungsgruppe mit dem Ergebnis von zurückab

Während das Muster (ab.+)nicht übereinstimmt und nichts zurückgibt.

Wenn Sie die Zeichenfolge jedoch wie folgt ändern, wird sie abafür das Muster zurückgegeben(ab.+)

aba
Azri Jamil
quelle
Ich denke, dies ist die bessere Antwort speziell auf die Frage von + vs *
Terrence
6

+ist minimal eins, *kann auch null sein.

Jeroen
quelle
"+ is minimal one"Was bedeutet dieser Satz?
Det
4

Ein Stern ist einem Plus sehr ähnlich. Der einzige Unterschied besteht darin, dass während das Plus 1 oder mehr des vorhergehenden Charakters / der vorhergehenden Gruppe entspricht, der Start 0 oder mehr entspricht.

Madaras Geist
quelle
4

In RegEx, {i,f}bedeutet "zwischen izu fmatches". Schauen wir uns die folgenden Beispiele an:

  • {3,7} bedeutet zwischen 3 bis 7 Übereinstimmungen
  • {,10} bedeutet bis zu 10 Übereinstimmungen ohne Untergrenze (dh die Untergrenze ist 0)
  • {3,} bedeutet mindestens 3 Übereinstimmungen ohne Obergrenze (dh die Obergrenze ist unendlich)
  • {,} bedeutet keine Obergrenze oder Untergrenze für die Anzahl der Übereinstimmungen (dh die Untergrenze ist 0 und die Obergrenze ist unendlich)
  • {5} bedeutet genau 4

Die meisten guten Sprachen enthalten Abkürzungen, RegEx auch:

  • + ist die Abkürzung für {1,}
  • * ist die Abkürzung für {,}
  • ? ist die Abkürzung für {,1}

Dies bedeutet, +dass mindestens 1 Übereinstimmung erforderlich ist, während *eine beliebige Anzahl von Übereinstimmungen oder überhaupt keine Übereinstimmungen ?akzeptiert werden und nicht mehr als 1 Übereinstimmung oder null Übereinstimmungen akzeptiert werden.

Bildnachweis: Codecademy.com

Miladiouss
quelle
2

Ich denke, die vorherigen Antworten heben kein einfaches Beispiel hervor:

Zum Beispiel haben wir ein Array:

numbers = [5, 15]

Der folgende Regex-Ausdruck ^[0-9]+stimmt überein: 15nur. Stimmt jedoch ^[0-9]*mit beiden überein 5 and 15. Der Unterschied besteht darin, dass der +Operator mindestens ein Duplikat des vorhergehenden regulären Ausdrucks benötigt

Crt
quelle