Случаи, где притяжательные и жадные кванторы `* +` и `*` дают разные результаты?

Я смотрел на этот вопрос Жадный против неохотного против властных квантификаторов

Я вижу, как *+ и * совпадают с нолем или более раз, но притяжательный квантификатор *+ будет как можно больше соответствовать вперёд. И * будет делать .* и назад. И я могу согласиться с тем, что *+ будет более эффективным, если длина строки .* длинна.

Мне интересно, когда они дают разные результаты.

И я увидел комментарий

@moodboom, всегда есть нулевые случаи (математический факт), где притяжательные кванторы будут давать совпадение, которое не будет произведено с помощью простых жадных кванторов. Бывают случаи, когда они будет давать несоответствие, когда жадные кванторы будут давать совпадение. Для ВСЕХ других случаев (где жадные и притяжательные производят одинаковые результаты), притяжательные кванторы дают прирост производительности. - Подстановочный знак 5 мая в 23:00

Мне было бы очень интересно увидеть это в расширенных случаях, в тех случаях, когда притяжательные и жадные кванторы дают другой результат.

Контрастность *+ и *

Меня также интересовал бы случай, какие разные результаты возможны, контрастируя ?+ vs ?

Ответ 1

Я нашел случай, но я не уверен в объяснении и уместности. И я думаю, что есть много других случаев.

Тестовая версия

greedy = /.*b/
posssessive = /.*+b/

Протестировано:

foob

Только жадные сочетания.

Объяснение

Признак сначала будет соответствовать цельной строке (.*+), а затем попытаться сопоставить b char, но найти только конец строки ($).

Greedy также будет соответствовать всей строке, но затем оглянитесь назад, пока не найдет первый b char. Что он найдет.

Ответ 2

проверьте примеры в демоверсии для тестовых строк aaab и aaax попробуйте жадный шаблон a*[^b] и притяжательный паттерн a*+[^b]

Демо 1

Демо 2

a*[^b] будет возвращаться, чтобы попытаться найти совпадение, поэтому он находит aaa в aaab

a*+[^b] найдет aaa не будет отступать и будет пытаться соответствовать [^b], терпит неудачу на aaab