2 Stimmen

Unterschied (falls vorhanden) zwischen .+? und .*

Ich durchsuche gerade einige alte Code-Basen und habe zwei reguläre Ausdrucksteile gefunden, die meiner Meinung nach semantisch identisch sind. Ich frage mich, ob die Stackoverflow-Community mein Verständnis bestätigen kann.

RegEx 1: (.+?) - Eins oder mehrere Zeichen, aber optional

RegEx 2: (.*) - Null oder mehr Zeichen

Ich denke immer wieder an verschiedene Szenarien, aber mir fällt kein Eingabebeispiel ein, bei dem beide Ausdrücke nicht gleich wären.

7voto

nhahtdh Punkte 54526

(.+?) bedeutet, dass ein oder mehr Zeichen übereinstimmen, aber anstelle des standardmäßigen greedy-Abgleichs (so viel wie möglich übereinstimmen), macht das ? nach dem Quantifizierer das Übereinstimmen lazy (so wenig wie möglich übereinstimmen).

Konzeptionell wird der greedige Abgleich zunächst versuchen, die längstmögliche Sequenz zu bilden, die durch das Muster im Inneren gebildet werden kann, und dann allmählich die Länge der Sequenz reduzieren, wenn das System zurückverfolgt. Der lazy Abgleich wird zunächst versuchen, die kürzeste mögliche Sequenz zu bilden, die durch das Muster im Inneren gebildet werden kann, und dann allmählich die Länge der Sequenz erhöhen, wenn das System zurückverfolgt.

Deshalb sind (.+?) und (.*) völlig verschieden. Bei einem String "abc" wird das Muster (.+?) für die erste Übereinstimmung "a" ergeben, während (.*) für die erste Übereinstimmung "abc" ergeben wird.

Wenn Sie das Muster auf die beabsichtigte Bedeutung korrigieren: ((?:.+)?), ist es genau dasselbe wie (.*) im Verhalten. Da der Quantifizierer standardmäßig greedy ist, wird ((?:.+)?) zunächst den Fall von .+ versuchen, bevor er den Fall von Leerzeichen versucht. Und .+ wird die längste Sequenz vor der 1-Zeichen-Sequenz versuchen. Daher ist der Effekt von ((?:.+)?) genau dasselbe wie (.*): es wird die längste Sequenz finden und allmählich zum Fall von Leerzeichen zurückverfolgen.

3voto

JasonG Punkte 5564

Zuerst,

. ist ein beliebiges Zeichen

Dann

* steht für null oder mehr
+ steht für eins oder mehr
? steht für eins oder keins

Denken Sie, dass .+? für eins oder mehr beliebige Zeichen und null oder eins von ihnen steht, schätze ich? Dabei fehlt Ihnen folgendes:

Lazy-Modifikator

*? steht für null oder mehr und so wenig wie möglich
+? steht für eins oder mehr und so wenig wie möglich

Siehe hier für weitere Diskussionen Gierige vs. Zurückhaltende vs. Besitzergreifende Quantifizierer

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X