Was ist der Unterschied zwischen:
(.+?)
und
(.*?)
wenn ich es in meinem PHP preg_matchRegex benutze ?
Was ist der Unterschied zwischen:
(.+?)
und
(.*?)
wenn ich es in meinem PHP preg_matchRegex 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.*?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
(.+?)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 abafü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 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
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