Случаи, где притяжательные и жадные кванторы `* +` и `*` дают разные результаты?
Я смотрел на этот вопрос Жадный против неохотного против властных квантификаторов
Я вижу, как *+
и *
совпадают с нолем или более раз, но притяжательный квантификатор *+
будет как можно больше соответствовать вперёд. И *
будет делать .*
и назад. И я могу согласиться с тем, что *+
будет более эффективным, если длина строки .*
длинна.
Мне интересно, когда они дают разные результаты.
И я увидел комментарий
@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