Was ist der Unterschied zwischen:
(.+?)
und
(.*?)
wenn ich es in meinem PHP preg_match
Regex benutze ?
Was ist der Unterschied zwischen:
(.+?)
und
(.*?)
wenn ich es in meinem PHP preg_match
Regex benutze ?
Antworten:
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 sind a(.+?)
, (.+?)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.*?
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.
+
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.
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 aba
für das Muster zurückgegeben(ab.+)
aba
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.
In RegEx, {i,f}
bedeutet "zwischen i
zu f
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 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
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: 15
nur. 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