Regex plus против звездной разницы?

91

В чем разница между:

(.+?)

и

(.*?)

когда я использую его в своем preg_matchрегулярном выражении php ?

Дэвид19801
источник

Ответы:

150

Их называют квантификаторами.

* 0 или более из предыдущего выражения

+ 1 или более из предыдущего выражения

По умолчанию квантификатор является жадным, что означает, что он соответствует как можно большему количеству символов.

После ?того, как квантификатор изменяет поведение, чтобы сделать этот квантификатор «неловким», означает, что он будет соответствовать как можно меньше.

Пример жадный / не жадный

Например, по строке « abab »

a.*b будет соответствовать "abab" (preg_match_all вернет одно совпадение, "abab")

while a.*?bбудет соответствовать только начальному "ab" (preg_match_all вернет два совпадения, "ab")

Вы можете протестировать свои регулярные выражения онлайн, например, на Regexr, см. Жадный пример здесь

стебель
источник
2
«ленивый» - более распространенный термин для «нелюбезного»
Уолтер Тросс
Пример неверный. Как (.+?)и (.*?)ведут себя по- разному в различной позиции регулярных выражений , которые a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
Louis55
Почему бы a. * B не вернуть «ab»? Разве здесь не говорится «слово, которое имеет от a до b, 0 или более символов», следовательно, ab имеет нулевой символ между и может быть совпадением. Почему это неправильно?
Hello World
@HelloWorld, это связано с жадностью, которую я объяснил выше. .*будет соответствовать как можно больше. Если вы хотите , чтобы остановить как можно раньше, то вы должны сделать его ungreedy.*?
STEMA
22

Первый ( +) - это один или несколько символов . Второй ( *) - ноль или более символов . Оба не являются жадными ( ?) и соответствуют чему угодно ( .).

Квентин
источник
1
Это зависит от того, установлен модификатор s или нет.
Quentin
8

A +соответствует одному или нескольким экземплярам предыдущего шаблона. A *соответствует нулю или более экземплярам предыдущего шаблона.

В общем, если вы используете a, +должен быть хотя бы один экземпляр шаблона, если вы *его используете, он все равно будет соответствовать, если его нет.

DaveRandom
источник
8

+ соответствует хотя бы одному символу

* соответствует любому количеству (включая 0) символов

Знак ?указывает на ленивое выражение, поэтому оно будет соответствовать как можно меньшему количеству символов.

Ксофмейстер
источник
8

Рассмотрим ниже строку для сопоставления.

ab

Шаблон (ab.*)вернет совпадение для группы захвата с результатомab

Пока шаблон (ab.+)не совпадет и ничего не вернет.

Но если вы измените строку на следующую, она вернется abaдля шаблона(ab.+)

aba
Азри Джамиль
источник
Я думаю, что это лучший ответ конкретно на вопрос + vs *
Терренс
6

+минимальная, также *может быть равна нулю.

jeroen
источник
"+ is minimal one"что означает это предложение?
Det
5

В RegEx, {i,f}означает «между iк fспичкам». Давайте посмотрим на следующие примеры:

  • {3,7} означает от 3 до 7 совпадений
  • {,10} означает до 10 совпадений без нижнего предела (т.е. нижний предел равен 0)
  • {3,} означает как минимум 3 совпадения без верхнего предела (т.е. верхний предел равен бесконечности)
  • {,} означает отсутствие верхнего или нижнего предела для количества совпадений (т.е. нижний предел равен 0, а верхний предел - бесконечность)
  • {5} означает ровно 4

Большинство хороших языков содержат сокращения, как и RegEx:

  • + это сокращение для {1,}
  • * это сокращение для {,}
  • ? это сокращение для {,1}

Это означает, что +требуется как минимум 1 совпадение, в то время как *допускается любое количество совпадений или полное отсутствие совпадений и ?допускается не более 1 совпадения или нуля совпадений.

Кредит: Codecademy.com

Miladiouss
источник
4

Звездочка очень похожа на плюс, с той лишь разницей, что плюс соответствует 1 или более из предшествующих символов / групп, а звездочка соответствует 0 или более.

Призрак Мадары
источник
2

Я думаю, что предыдущие ответы не смогли выделить простой пример:

например у нас есть массив:

numbers = [5, 15]

Соответствует следующее выражение регулярного выражения ^[0-9]+: 15только. Однако ^[0-9]*соответствует обоим 5 and 15. Разница в том, что для +оператора требуется по крайней мере один дубликат предыдущего выражения регулярного выражения.

Crt
источник