Регулярное выражение плюс против звездной разницы?


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

(.+?)

и

(.*?)

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

9 59

9 ответов:

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

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

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

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

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

пример жадный / нескладный

например на строку " abab"

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

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

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

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

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

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

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

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

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

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

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

рассмотрим ниже строку, чтобы соответствовать.

ab

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

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

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

aba

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

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

большинство хороших языков содержат аббревиатуры, так же как и регулярное выражение:

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

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

Кредит: Codecademy.com

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

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

numbers = [5, 15]

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