Znalazłem ten doskonały samouczek na temat wyrażeń regularnych i chociaż intuicyjnie rozumiem, co robią kwantyfikatory „chciwi”, „niechętni” i „zaborczy”, wydaje się, że mam poważne wątpliwości.
W szczególności w następującym przykładzie:
Enter your regex: .*foo // greedy quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.
Enter your regex: .*?foo // reluctant quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.
Enter your regex: .*+foo // possessive quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.
Wyjaśnienie wspomina jedzenia cały ciąg wejściowy, listów zostały zużyte , dopasowujący odejściu , skrajna występowanie „foo” został regurgitated , etc.
Niestety, pomimo miłych metafor, wciąż nie rozumiem, co je ktoś ... Czy znasz inny samouczek, który wyjaśnia (zwięźle), jak działają silniki wyrażeń regularnych?
Alternatywnie, jeśli ktoś może wyjaśnić nieco inaczej frazując następujący akapit, byłoby to bardzo mile widziane:
Pierwszy przykład wykorzystuje chciwy kwantyfikator. *, Aby znaleźć „cokolwiek”, zero lub więcej razy, a następnie litery „f” „o” „o”. Ponieważ kwantyfikator jest zachłanny, część. * Wyrażenia najpierw zjada cały ciąg wejściowy. W tym momencie ogólne wyrażenie nie może się powieść, ponieważ ostatnie trzy litery („f” „o” „o”) zostały już wykorzystane ( przez kogo? ). Tak więc dopasowujący powoli cofa się ( od prawej do lewej? ) Po jednej literze, aż do wystąpienia zwrotu „foo” znajdującego się najbardziej po prawej stronie ( co to znaczy? ), W którym to momencie dopasowanie kończy się i wyszukiwanie się kończy.
Drugi przykład jest jednak niechętny, więc zaczyna się od skonsumowania ( przez kogo? ) „Nic”. Ponieważ „foo” nie pojawia się na początku łańcucha, jest zmuszone do przełknięcia ( kto połyka?) Pierwszej litery („x”), co wyzwala pierwsze dopasowanie przy 0 i 4. Nasza uprząż testowa kontynuuje proces dopóki łańcuch wejściowy nie zostanie wyczerpany. Znajduje kolejny mecz przy 4 i 13.
W trzecim przykładzie nie można znaleźć dopasowania, ponieważ kwantyfikator jest dzierżawczy. W tym przypadku cały ciąg wejściowy jest zużywany przez. * +, ( Jak? ) Nie pozostawiając nic, co mogłoby zaspokoić „foo” na końcu wyrażenia. Użyj kwantyfikatora dzierżawczego w sytuacjach, w których chcesz przejąć wszystko bez wycofywania się ( co oznacza wycofanie? ); przewyższy równoważny chciwy kwantyfikator w przypadkach, gdy dopasowanie nie zostanie natychmiast znalezione.
*
,+
i?
są chciwi. Minimalny kwantyfikatory podoba*?
,+?
i??
są leniwi. Dzierżawcze kwantyfikatorów jak*+
,++
i?+
są lepkie.