2017-12-20 7 views
3

Regex101 Link: https://regex101.com/r/MsZy0A/2Warum stimmt dieses Regex-Muster nicht überein?

Ich habe das folgende Regex-Muster; .++b mit den folgenden Testdaten; aaaaaaaacaeb.

Was ich nicht verstehe, ist der "Possessive Quantifier". Ich habe gelesen, dass es nicht zurückführt, was es normalerweise tut. Aber ich denke nicht, dass es sowieso zurückgehen muss? Sie muss nur bis einschließlich "b" übereinstimmen, "b" würde zweimal abgeglichen werden, da .+ mit allem übereinstimmt (einschließlich "b"), und das "b" nach "b" würde auch mit "b" übereinstimmen.

Könnte jemand bitte die Rolle des Possessiv-Quantors erklären?

Diese Frage ist kein Duplikat von dem notierten, ich frage nach diesem speziellen Fall, weil ich es immer noch nicht bekommen habe, nachdem ich die andere Antwort gelesen habe.

+3

Ich habe noch nie ein solches Muster gesehen, aber '(. +) + B' funktioniert gut. So auch ". + B". –

+0

Warum müssten Sie +? Was soll das zweite tun? – Andreas

+6

Da Possessiv-Quantor nicht zurückverfolgt '. ++' stimmt mit allem überein, einschließlich letzten 'b' daher letzten' b' passt nie – anubhava

Antwort

3

++ Übereinstimmungen zwischen einer und unbegrenzten Zeiten, so oft wie möglich, ohne zurück - bedeutet, wenn Sie schreiben .++, es entspricht alles einschließlich der endgültigen b. So wird die zusätzliche b in Ihrem Regex nie übereinstimmen.

Sie könnten dies umgehen, wenn Sie keine Possessivquantifizierer verwenden oder entfernen Sie einfach die b aus der passenden Klasse [^b]++b - aber ich würde die erste empfehlen. Possessive Quantoren sind fast immer unnötig.

+2

yeah, aber was machst du, wenn es ein oder mehrere 'b' in der Mitte der Saite gibt? Ich ** glaube nicht, dass' [^ b] ++ b' ** richtig funktioniert * * ... Going für '. + B' wäre besser? – Allan

+1

Wie wenns sonst nicht wüsste, was er eigentlich schiebe will, kann ich euch nicht sagen, was wirklich die beste Lösung ist – Philipp

+0

ja deshalb habe ich +1 gewählt :-) – Allan

Verwandte Themen