Разница между ". +" И ". +?"
Может кто-нибудь объяснить разницу между .+
и .+?
У меня есть строка: "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