Was ist der Unterschied zwischen Regex (. *?) und (. *)?

8

Ich habe eine Weile Regex gemacht, aber ich bin kein Experte für die Feinheiten, was bestimmte Regeln tun, ich habe immer (.*?) für das Matching gemacht, aber mit Einschränkungen, wie ich es verstanden habe, würde es aufhören die erste Chance, die es bekam, während (.*)? weiter und gieriger sein würde.

Aber ich habe keinen wirklichen Grund, warum ich das denke, ich denke es einfach, weil ich es einmal gelesen habe.

jetzt würde ich gerne wissen, gibt es einen Unterschied? und wenn ja, was ist es ...

    
Christopher Thomas 04.12.2012, 14:45
quelle

4 Antworten

11

(.*?) ist eine Gruppe, die eine nicht gierige Übereinstimmung enthält.

(.*)? ist eine optionale Gruppe, die eine gierige Übereinstimmung enthält.

    
SLaks 04.12.2012, 14:48
quelle
3

Das ? hat unterschiedliche Bedeutungen.

  1. Wenn es einem Zeichen oder einer Gruppe folgt, ist es ein Quantifizierer, der das 0 oder 1 Vorkommen des vorhergehenden Konstrukts abgleicht. Details finden Sie hier

  2. Wenn es einem Quantifizierer folgt, ändert es das Übereinstimmungsverhalten dieses Quantifizierers, wodurch es mit faul / ungegerecht übereinstimmt. Siehe hier für Details

stema 04.12.2012 14:55
quelle
3

Weil * "null oder mehr" bedeutet, wird alles etwas verwirrend. Beide ? sind ziemlich unterschiedlich, was mit einem anderen Beispiel für jedes deutlicher gezeigt werden kann:

fo*? stimmt nur mit f überein, wenn Sie foo angeben. Das heißt, dass ? die Übereinstimmung nicht gierig macht. Wenn Sie es entfernen, stimmt es mit foo überein.

fo? entspricht f , aber auch fo . Das heißt, diese ? macht die Übereinstimmung optional: Der Teil, auf den sie angewendet wird (in diesem Fall nur o ) muss 0 oder 1 Mal vorhanden sein. Durch das Entfernen wird die Übereinstimmung erforderlich: Sie muss dann genau einmal vorhanden sein, sodass nur fo noch übereinstimmt.

Und während wir uns in% regexps auf eine andere Bedeutung von ? beziehen, gibt es noch eine weitere: a ? unmittelbar nach ( ist ein Präfix für mehrere spezielle Operationen, wie zum Beispiel Lookaround. Das heißt, seine Bedeutung ist nicht wie die Dinge, die du fragst.

    
Bas Wijnen 04.12.2012 14:58
quelle
2

Andere haben auf den Unterschied zwischen gierigen und nicht gierigen Spielen hingewiesen. Hier ist ein Beispiel für verschiedene Ergebnisse, die Sie in der Praxis sehen können. Da reguläre Ausdrücke oft in eine Hostsprache eingebettet sind, verwende ich Perl als Host. In Perl werden durch das Einschließen von Übereinstimmungen in Klammern die Ergebnisse dieser Übereinstimmungen speziellen Variablen zugewiesen. Daher können die Übereinstimmungen in diesem Fall identisch sein, aber was diesen Variablen zugewiesen ist, darf nicht:

Nehmen wir an, Ihre Match-Zeichenfolge lautet "Hallo". Beide Muster stimmen überein, aber die übereinstimmenden Teile ($ 1) unterscheiden sich:

%Vor%     
RonaldBarzell 04.12.2012 14:48
quelle

Tags und Links