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