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