fand ich, dass nicht gieriger Regex nur nicht gierig werden, wenn sie an den vorderen Verankerung, nicht bis zum Ende:Regex eines nicht-gierigen Spiel unterschiedlichen Verhalten
$ echo abcabcabc | perl -ne 'print $1 if /^(a.*c)/'
abcabcabc
# OK, greedy match
$ echo abcabcabc | perl -ne 'print $1 if /^(a.*?c)/'
abc
# YES! non-greedy match
Nun Blick auf diese, wenn die Verankerung bis zum ende:
$ echo abcabcabc | perl -ne 'print $1 if /(a.*c)$/'
abcabcabc
# OK, greedy match
$ echo abcabcabc | perl -ne 'print $1 if /(a.*?c)$/'
abcabcabc
# what, non-greedy become greedy?
warum ist das? wie kommt es nicht abc
wie vorher drucken?
(Das Problem wurde in meinem Go-Code gefunden, aber zur Vereinfachung in Perl dargestellt).
'/(a.c *?) $ /' Stimmt mit der letzten 'abc' in 'abcabcabc' überein. Da Sie am Ende verankern, sollte das c nicht gierig gemacht werden. –
@AdityaJ., Nein, Sie haben den "Algorithmus" geändert. Für Ihre "Lösung", auch ohne '*?', D. H. '/(a.c) $ /', würde es immer noch funktionieren. Aber danke fürs ausprobieren. – xpt
Mit '. *?' Beginnt die Regex-Engine mit der Mindestanzahl von Zeichen, die vom Quantifizierer erlaubt sind - was ** null ** ist. Der Motor fährt dann fort und versucht das nächste Token. Dies schlägt fehl, also rückt die Engine zurück und erweitert ihre Übereinstimmung. Der Prozess wiederholt sich selbst - die Regex-Engine rückt vor, schlägt fehl, backtracks, erweitert ihre Übereinstimmung erneut, schreitet fort, scheitert, ... dies ist ein Fall für die Negation '/ a [^ a] * c $ /' – hwnd