Разница между ". +" И ". +?"

Может кто-нибудь объяснить разницу между .+ и .+?

У меня есть строка: "extend cup end table"

  • Образец e.+d находит: extend cup end
  • Образец e.+?d находит: extend и end

Я знаю, что + - один или несколько, а ? - один или ноль. Но я не могу понять, как это работает.

Ответ 1

Оба будут соответствовать любой последовательности из одного или нескольких символов. Разница в том, что:

  • .+ является жадным и потребляет столько символов, сколько может.
  • .+? неохотно и потребляет как можно меньше символов.

См. Различия между жадными, неохотными и притяжательными квантификаторами в руководстве по Java.

Таким образом:

  • e.+d находит самую длинную подстроку, которая начинается с e и заканчивается d (и содержит хотя бы один символ между ними). В вашем примере extend cup end будет найдено.
  • e.+?d найти самую короткую такую подстроку. В вашем примере, extend и end - два таких неперекрывающихся совпадения, поэтому он находит оба.

Ответ 2

Регулярное выражение e.+?d соответствует 'e', а затем пытается сопоставить как можно меньше символов (неровный или неохотный), за которым следует 'd'. Вот почему подобраны следующие 2 подстроки:

extend cup end table
^^^^^^     ^^^
  1         2

Регулярное выражение e.+d соответствует 'e', а затем пытается сопоставить как можно больше символов (жадных), а затем 'd'. Случается, что первый 'e' найден, а затем .+ соответствует столько, сколько может (до конца строки или ввода):

extend cup end table
^^^^^^^^^^^^^^^^^^^^

Двигатель regex подходит к концу строки (или ввода) и не может соответствовать 'd' в шаблоне регулярных выражений. Таким образом, он возвращается к последнему 'd'. Вот почему найдено одно совпадение:

extend cup end table
^^^^^^^^^^^^^^<----- backtrack
  1