В чем разница между:
(.+?)
и
(.*?)
когда я использую его в своем preg_match
регулярном выражении php ?
Их называют квантификаторами.
*
0 или более из предыдущего выражения
+
1 или более из предыдущего выражения
По умолчанию квантификатор является жадным, что означает, что он соответствует как можно большему количеству символов.
После ?
того, как квантификатор изменяет поведение, чтобы сделать этот квантификатор «неловким», означает, что он будет соответствовать как можно меньше.
Пример жадный / не жадный
Например, по строке « abab »
a.*b
будет соответствовать "abab" (preg_match_all вернет одно совпадение, "abab")
while a.*?b
будет соответствовать только начальному "ab" (preg_match_all вернет два совпадения, "ab")
Вы можете протестировать свои регулярные выражения онлайн, например, на Regexr, см. Жадный пример здесь
(.+?)
и(.*?)
ведут себя по- разному в различной позиции регулярных выражений , которыеa(.+?)
,(.+?)b
,a(.+?)b
,a(.*?)
,(.*?)b
,a(.*?)b
..*
будет соответствовать как можно больше. Если вы хотите , чтобы остановить как можно раньше, то вы должны сделать его ungreedy.*?
Первый (
+
) - это один или несколько символов . Второй (*
) - ноль или более символов . Оба не являются жадными (?
) и соответствуют чему угодно (.
).источник
A
+
соответствует одному или нескольким экземплярам предыдущего шаблона. A*
соответствует нулю или более экземплярам предыдущего шаблона.В общем, если вы используете a,
+
должен быть хотя бы один экземпляр шаблона, если вы*
его используете, он все равно будет соответствовать, если его нет.источник
+
соответствует хотя бы одному символу*
соответствует любому количеству (включая 0) символовЗнак
?
указывает на ленивое выражение, поэтому оно будет соответствовать как можно меньшему количеству символов.источник
Рассмотрим ниже строку для сопоставления.
Шаблон
(ab.*)
вернет совпадение для группы захвата с результатомab
Пока шаблон
(ab.+)
не совпадет и ничего не вернет.Но если вы измените строку на следующую, она вернется
aba
для шаблона(ab.+)
источник
+
минимальная, также*
может быть равна нулю.источник
"+ is minimal one"
что означает это предложение?В RegEx,
{i,f}
означает «междуi
кf
спичкам». Давайте посмотрим на следующие примеры:{3,7}
означает от 3 до 7 совпадений{,10}
означает до 10 совпадений без нижнего предела (т.е. нижний предел равен 0){3,}
означает как минимум 3 совпадения без верхнего предела (т.е. верхний предел равен бесконечности){,}
означает отсутствие верхнего или нижнего предела для количества совпадений (т.е. нижний предел равен 0, а верхний предел - бесконечность){5}
означает ровно 4Большинство хороших языков содержат сокращения, как и RegEx:
+
это сокращение для{1,}
*
это сокращение для{,}
?
это сокращение для{,1}
Это означает, что
+
требуется как минимум 1 совпадение, в то время как*
допускается любое количество совпадений или полное отсутствие совпадений и?
допускается не более 1 совпадения или нуля совпадений.Кредит: Codecademy.com
источник
Звездочка очень похожа на плюс, с той лишь разницей, что плюс соответствует 1 или более из предшествующих символов / групп, а звездочка соответствует 0 или более.
источник
Я думаю, что предыдущие ответы не смогли выделить простой пример:
например у нас есть массив:
numbers = [5, 15]
Соответствует следующее выражение регулярного выражения
^[0-9]+
:15
только. Однако^[0-9]*
соответствует обоим5 and 15
. Разница в том, что для+
оператора требуется по крайней мере один дубликат предыдущего выражения регулярного выражения.источник