Was ist der Unterschied zwischen:
(.+?)
und
(.*?)
wenn ich es in meinem PHP preg_match
Regex benutze ?
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.*?b
stimmt 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
(.+?)
und(.*?)
verhalten sich anders in einer verschiedenen Position von regulären Ausdrücken , die sinda(.+?)
,(.+?)b
,a(.+?)b
,a(.*?)
,(.*?)b
,a(.*?)b
..*
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.*?
Das erste (
+
) besteht aus einem oder mehreren Zeichen . Das zweite (*
) besteht aus null oder mehr Zeichen . Beide sind nicht gierig (?
) und passen zu allem (.
).quelle
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.quelle
+
entspricht mindestens einem Zeichen*
Entspricht einer beliebigen Anzahl (einschließlich 0) von ZeichenDas
?
zeigt einen faulen Ausdruck an, sodass so wenige Zeichen wie möglich übereinstimmen.quelle
Betrachten Sie unten die passende Zeichenfolge.
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
aba
für das Muster zurückgegeben(ab.+)
quelle
+
ist minimal eins,*
kann auch null sein.quelle
"+ is minimal one"
Was bedeutet dieser Satz?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.
quelle
In RegEx,
{i,f}
bedeutet "zwischeni
zuf
matches". 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 4Die 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
quelle
Ich denke, die vorherigen Antworten heben kein einfaches Beispiel hervor:
Zum Beispiel haben wir ein Array:
Der folgende Regex-Ausdruck
^[0-9]+
stimmt überein:15
nur. Stimmt jedoch^[0-9]*
mit beiden überein5 and 15
. Der Unterschied besteht darin, dass der+
Operator mindestens ein Duplikat des vorhergehenden regulären Ausdrucks benötigtquelle