Наличие $
в регулярном выражении не влияет на жадность выражения. Это просто добавляет другое условие, которое должно быть выполнено, чтобы общий матч был успешным.
И a+
, и a+?
должны потреблять первые найденные a
. Если за этим a
следуют еще a
, a+
идет вперед и потребляет их тоже, в то время как a+?
доволен только одним. Если бы в регулярном выражении было что-то большее, a+
был бы готов согласиться на меньшее количество a
, а a+?
потребляло бы больше, если это то, что требовалось для достижения соответствия.
С a+$
и a+?$
вы добавили еще одно условие: сопоставьте хотя бы одно a
, за которым следует конец строки. a+
по-прежнему потребляет все a
вначале, а затем передает его на якорь ($
). Это удастся с первой попытки, поэтому a+
не нужно возвращать ни одного из a
.
С другой стороны, a+?
изначально потребляет только один a
, прежде чем передать $
. Это терпит неудачу, поэтому элемент управления возвращается к a+?
, который потребляет еще a
и снова отключается. И так до тех пор, пока a+?
не израсходует последние a
и $
наконец не преуспеет. Так что да, a+?$
соответствует тому же числу a
, что и a+$
, но это происходит неохотно, но неохотно.
Что касается самого левого-самого длинного правила, которое было упомянуто в другом месте, оно никогда не применялось к производным от Perl разновидностям регулярных выражений, таким как Python. Даже без неохотных квантификаторов они всегда могут вернуть совпадение меньше максимального, благодаря упорядоченному чередованию . Я думаю, что у Джена правильная идея: Perl-производные (или ориентированные на регулярные выражения) ароматы должны называться eager , а не жадными.
Я считаю, что самое левое-самое длинное правило применимо только к регулярным выражениям POSIX NFA, которые используют механизмы NFA под капотом, но обязаны возвращать те же результаты, что и регулярное выражение DFA (текстовое).