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

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

(.+?)

и

(.*?)

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

Ответ 1

Они называются кванторами.

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

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

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

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

Пример жадных/неровных

Например, в строке "abab"

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Рассмотрим ниже строку, которая будет соответствовать.

ab

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

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

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

aba

Ответ 8

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

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

numbers = [5, 15]

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

Ответ 9

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

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

Большинство хороших языков содержат аббревиатуры, поэтому RegEx:

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

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

Кредит: Codecademy.com