Яка різниця між:
(.+?)
і
(.*?)
коли я використовую його у своєму preg_matchрегулярному виразі php ?
Яка різниця між:
(.+?)
і
(.*?)
коли я використовую його у своєму preg_matchрегулярному виразі php ?
Відповіді:
Їх називають кванторами.
* 0 або більше попереднього виразу
+ 1 або більше попереднього виразу
За замовчуванням квантор є жадібним, це означає, що він відповідає якомога більшій кількості символів.
Після ?того, як квантор змінює поведінку, щоб зробити цей квантор "ненажерливим", це означає, що він буде збігатися якомога менше.
Приклад жадібний / ненажерливий
Наприклад, на рядок " абаб "
a.*b буде відповідати "abab" (preg_match_all поверне один збіг, "abab")
while a.*?bбуде відповідати лише початковому "ab" (preg_match_all поверне два збіги, "ab")
Ви можете перевірити свої регулярні вирази в Інтернеті, наприклад, на Regexr, див. Жадібний приклад тут
(.+?)і (.*?)поводяться по- різному в різному позиції регулярних виразів , які a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
.*максимально збігатиметься. Якщо ви хочете зупинитися якомога раніше, тоді вам доведеться зробити це ненажерливим.*?
Збіг +відповідає одному або декільком екземплярам попереднього зразка. A *відповідає нулю або більше екземплярів попереднього шаблону.
Отже, в основному, якщо ви використовуєте a +, повинен бути принаймні один екземпляр шаблону, якщо ви *його використовуєте, він все одно буде відповідати, якщо його екземплярів немає.
+ відповідає принаймні одному символу
* відповідає будь-якій кількості (включаючи 0) символів
Значок ?вказує на ледачий вираз, тому він буде відповідати якомога меншій кількості символів.
Розглянемо нижче рядок, що відповідає.
ab
Візерунок (ab.*) поверне збіг для групи захоплення з результатомab
Поки шаблон (ab.+)не буде збігатися і нічого не повертає.
Але якщо ви зміните рядок на наступний, він повернеться abaдо шаблону(ab.+)
aba
У RegEx, {i,f}означає «між iдо fсірників». Давайте подивимось на такі приклади:
{3,7} означає від 3 до 7 збігів {,10} означає до 10 збігів без нижньої межі (тобто нижня межа - 0){3,} означає принаймні 3 збіги без верхньої межі (тобто верхня межа - нескінченність){,} означає відсутність верхньої або нижньої межі кількості збігів (тобто нижня межа становить 0, а верхня межа - нескінченність){5} означає рівно 4 Більшість хороших мов містять скорочення, як і RegEx:
+ - це скорочення для {1,}* - це скорочення для {,}? - це скорочення для {,1}Це означає, що +потрібно принаймні 1 матч, при цьому *приймається будь-яка кількість матчів або взагалі не відповідає і ?приймає не більше 1 матчу або нульових матчів.
Кредит: Codecademy.com
Зірка дуже схожа на плюс, єдина різниця полягає в тому, що хоча плюс відповідає 1 або більше попереднього персонажа / групи, зірка відповідає 0 або більше.
Я думаю, що попередні відповіді не виділяють простого прикладу:
наприклад, ми маємо масив:
numbers = [5, 15]
Наступний вираз регулярного виразу ^[0-9]+відповідає: 15лише. Однак ^[0-9]*відповідає обом 5 and 15. Різниця полягає в тому, що +оператору потрібен принаймні один дублікат попереднього виразу регулярного виразу