В чем разница между:
(.+?)
а также
(.*?)
когда я использую его в своем 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