Я нашел этот превосходный учебник по регулярным выражениям, и хотя я интуитивно понимаю, что делают «жадные», «неохотные» и «притяжательные» квантификаторы, в моем понимании есть серьезная дыра.
В частности, в следующем примере:
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.
Объяснение упоминает ест всю строку ввода, буквы были потребляется , согласованями отступая , крайнее справа появление «Foo» было выплюнули и т.д.
К сожалению, несмотря на прекрасные метафоры, я до сих пор не понимаю, что есть, кем ... Кто-нибудь знает другой учебник, который (кратко) объясняет, как работают механизмы регулярных выражений?
В качестве альтернативы, если кто-то может объяснить в несколько иной формулировке следующий абзац, это будет высоко ценится:
В первом примере используется жадный квантификатор. * Для поиска «чего угодно», ноль или более раз, за которым следуют буквы «f», «o», «o». Поскольку квантификатор является жадным, часть выражения. * Сначала съедает всю входную строку. На этом этапе общее выражение не может быть успешно выполнено, поскольку последние три буквы («f», «o», «o») уже были использованы ( кем? ). Таким образом, средство сравнения медленно отступает ( справа налево? ) По одной букве за раз, пока не произойдет регургитация самого правого вхождения «foo» ( что это значит? ), И в этот момент совпадение будет успешным, и поиск закончится.
Второй пример, однако, неохотен, поэтому он начинает с того, что сначала потребляет ( кем? ) «Ничего». Поскольку «foo» не появляется в начале строки, он вынужден проглотить ( кто глотает?) Первую букву («x»), что вызывает первое совпадение в 0 и 4. Наш тестовый жгут продолжает процесс пока строка ввода не исчерпана. Он находит другой матч в 4 и 13.
Третий пример не может найти соответствие, потому что квантификатор является притяжательным. В этом случае вся входная строка используется. * +, ( Как? ), Не оставляя ничего, чтобы удовлетворить «foo» в конце выражения. Используйте собственнический квантификатор для ситуаций, когда вы хотите захватить все что-либо, даже не отступая ( что означает отступление? ); он превзойдет эквивалентный жадный квантификатор в случаях, когда совпадение не найдено сразу.
*
,+
и?
являются жадными. Минимально кванторы нравится*?
,+?
и??
являются ленивыми. Притяжательные кванторам нравятся*+
,++
и?+
являются липкими.