Regex plus проти різниці зірок?


90

Яка різниця між:

(.+?)

і

(.*?)

коли я використовую його у своєму preg_matchрегулярному виразі php ?

Відповіді:


150

Їх називають кванторами.

* 0 або більше попереднього виразу

+ 1 або більше попереднього виразу

За замовчуванням квантор є жадібним, це означає, що він відповідає якомога більшій кількості символів.

Після ?того, як квантор змінює поведінку, щоб зробити цей квантор "ненажерливим", це означає, що він буде збігатися якомога менше.

Приклад жадібний / ненажерливий

Наприклад, на рядок " абаб "

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, це пов’язано з жадібністю, яку я пояснив вище. .*максимально збігатиметься. Якщо ви хочете зупинитися якомога раніше, тоді вам доведеться зробити це ненажерливим.*?
stema

22

Перший ( +) - це один або кілька символів . Другий ( *) - нуль або більше символів . Обидва вони не жадібні ( ?) і збігаються з чимось ( .).


1
Це залежить від того, встановлено модифікатор s чи ні.
Квентін

8

Збіг +відповідає одному або декільком екземплярам попереднього зразка. A *відповідає нулю або більше екземплярів попереднього шаблону.

Отже, в основному, якщо ви використовуєте a +, повинен бути принаймні один екземпляр шаблону, якщо ви *його використовуєте, він все одно буде відповідати, якщо його екземплярів немає.


8

+ відповідає принаймні одному символу

* відповідає будь-якій кількості (включаючи 0) символів

Значок ?вказує на ледачий вираз, тому він буде відповідати якомога меншій кількості символів.


8

Розглянемо нижче рядок, що відповідає.

ab

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

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

Але якщо ви зміните рядок на наступний, він повернеться abaдо шаблону(ab.+)

aba

Я думаю, що це краща відповідь конкретно на питання + проти *
Терренс

6

+є мінімальним, *може бути нулем.


"+ 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


4

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


2

Я думаю, що попередні відповіді не виділяють простого прикладу:

наприклад, ми маємо масив:

numbers = [5, 15]

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.