Регулярные выражения могут потенциально соответствовать нескольким частям текста.
Например, рассмотрим выражение (ab)*c+
и строку "abccababccc"
. Есть много частей строки, которые могут соответствовать регулярным выражениям:
(abc)cababccc
(abcc)ababccc
abcc(ababccc)
abccab(abccc)
ab(c)cababccc
ab(cc)ababccc
abcabab(c)ccc
....
некоторые реализации регулярных выражений на самом деле способны возвращать весь набор совпадений, но чаще всего возвращают одно совпадение.
Существует множество возможных способов определения «победного матча». Наиболее распространенным является получение " самого длинного левого совпадения ", что приводит к жадному поведению, которое вы наблюдали.
Это типично для поиска и замены (а-ля grep
), когда с a+
вы, вероятно, имеете в виду совпадение всего aaaa
, а не одного a
.
Выбор "кратчайшего непустого крайнего левого" совпадения - это обычное не жадное поведение. Это наиболее полезно, когда у вас есть разделители , как в вашем случае.
Все зависит от того, что вам нужно, иногда с жадностью все в порядке, в других случаях, как в случае, который вы показали, не жадное поведение будет более значимым. Хорошо, что современные реализации регулярных выражений позволяют нам делать и то, и другое.