В чем разница между:
(.+?)
а также
(.*?)
когда я использую его в своем php preg_match
regex?
Они называются кванторами.
*
0 или более предыдущего выражения
+
1 или более из предыдущего выражения
По умолчанию квантификатор является жадным, это означает, что он соответствует как можно большему количеству символов.
?
после того, как квантификатор изменит поведение, чтобы сделать этот квантификатор «неровным», означает, что он будет соответствовать как можно меньше.
Пример жадных / неразборчивых
Например, в строке " abab "
a.*b
будет соответствовать «abab» (preg_match_all вернет одно совпадение, «abab»)
в то время a.*?b
будет соответствовать только стартовому «ab» (preg_match_all вернет два совпадения, «ab»)
Вы можете тестировать свои регулярные выражения онлайн, например, в Regexr, см. Жадный пример здесь
Первый ( +
) – один или несколько символов . Второй ( *
) – это ноль или более символов . Оба не являются жадными ( ?
) И соответствуют всем ( .
).
+
минимально, *
может быть нулем.
A +
соответствует одному или нескольким экземплярам предыдущего шаблона. A *
соответствует нулю или более экземплярам предыдущего шаблона.
Поэтому в основном, если вы используете +
должен быть хотя бы один экземпляр шаблона, если вы используете *
он все равно будет соответствовать, если нет его экземпляров.
+
соответствует хотя бы одному символу
*
соответствует любому числу (включая 0) символов
?
указывает на ленивое выражение, поэтому оно будет соответствовать как можно меньшему количеству символов.
Звезда очень похожа на плюс, единственное отличие состоит в том, что, хотя плюс соответствует 1 или более предшествующим символу / группе, начало соответствует 0 или более.
Рассмотрим ниже строку, которая будет соответствовать.
ab
Образец (ab.*)
Вернет совпадение для группы захвата с результатом ab
Хотя шаблон (ab.+)
будет соответствовать и ничего не возвращает.
Но если вы измените строку на следующую, она вернет aba
для шаблона (ab.+)
aba
Я думаю, что в предыдущих ответах не был показан простой пример:
например, у нас есть массив:
numbers = [5, 15]
Следующее выражение регулярного выражения ^[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 совпадение, в то время как *
принимает любое количество совпадений или нет совпадений вообще и ?
принимает не более 1 совпадающих или нулевых совпадений.
Кредит: Codecademy.com