(.+?)
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.