Jaka jest różnica pomiędzy:
(.+?)
i
(.*?)
kiedy używam go w moim preg_match
wyrażeniu regularnym php ?
Jaka jest różnica pomiędzy:
(.+?)
i
(.*?)
kiedy używam go w moim preg_match
wyrażeniu regularnym php ?
Odpowiedzi:
Nazywa się je kwantyfikatorami.
*
0 lub więcej poprzedniego wyrażenia
+
1 lub więcej poprzedniego wyrażenia
Domyślnie kwantyfikator jest chciwy, co oznacza, że dopasowuje jak najwięcej znaków.
Gdy ?
kwantyfikator zmieni zachowanie, aby ten kwantyfikator był „niesmaczny”, oznacza, że będzie pasował tak mało, jak to możliwe.
Przykład chciwy / nieszczęśliwy
Na przykład w ciągu „ abab ”
a.*b
dopasuje „abab” (preg_match_all zwróci jedno dopasowanie, „abab”)
while a.*?b
dopasuje tylko początkowe „ab” (preg_match_all zwróci dwa dopasowania, „ab”)
Możesz przetestować swoje wyrażenia regularne online, np. Na Regexr, zobacz chciwy przykład tutaj
(.+?)
i (.*?)
zachowują się inaczej w różnych pozycji wyrażeń regularnych, które są a(.+?)
, (.+?)b
, a(.+?)b
, a(.*?)
, (.*?)b
, a(.*?)b
.
.*
będzie pasować tak bardzo, jak to możliwe. Jeśli chcesz zatrzymać się tak wcześnie, jak to możliwe, musisz zrobić to nieszczęśliwie.*?
A +
pasuje do co najmniej jednego wystąpienia poprzedniego wzorca. A *
dopasowuje zero lub więcej wystąpień poprzedniego wzorca.
Zasadniczo, jeśli używasz a +
, musi istnieć co najmniej jedno wystąpienie wzorca, jeśli *
go użyjesz , nadal będzie pasować, jeśli nie ma jego instancji.
+
dopasowuje co najmniej jeden znak
*
dopasowuje dowolną liczbę (w tym 0) znaków
Znak ?
wskazuje na leniwe wyrażenie, więc dopasuje jak najmniej znaków.
Rozważ poniżej, jaki ciąg ma pasować.
ab
Wzorzec (ab.*)
zwróci dopasowanie dla grupy przechwytywania z wynikiemab
Podczas gdy wzór (ab.+)
nie będzie pasował i nic nie zwróci.
Ale jeśli zmienisz ciąg na następujący, powróci on aba
do wzorca(ab.+)
aba
W wyrażeniu regularnym {i,f}
oznacza „między i
do f
dopasowań”. Spójrzmy na następujące przykłady:
{3,7}
oznacza od 3 do 7 meczów {,10}
oznacza do 10 trafień bez dolnego limitu (czyli dolny limit to 0){3,}
oznacza co najmniej 3 dopasowania bez górnej granicy (tj. górną granicą jest nieskończoność){,}
oznacza brak górnej lub dolnej granicy dla liczby dopasowań (tj. dolna granica to 0, a górna to nieskończoność){5}
oznacza dokładnie 4 Większość dobrych języków zawiera skróty, podobnie jak RegEx:
+
to skrót od {1,}
*
to skrót od {,}
?
to skrót od {,1}
Oznacza to, że +
wymaga co najmniej 1 dopasowania, *
akceptuje dowolną liczbę dopasowań lub nie ?
akceptuje żadnych dopasowań i akceptuje nie więcej niż 1 dopasowanie lub zero dopasowań.
Kredyt: Codecademy.com
Gwiazdka jest bardzo podobna do plusa, jedyną różnicą jest to, że podczas gdy plus pasuje do 1 lub więcej poprzedzających znaków / grup, gwiazda odpowiada 0 lub więcej.
Myślę, że poprzednie odpowiedzi nie wskazują na prosty przykład:
na przykład mamy tablicę:
numbers = [5, 15]
Następujące wyrażenie regularne ^[0-9]+
pasuje: 15
tylko. Jednak ^[0-9]*
pasuje do obu 5 and 15
. Różnica polega na tym, że +
operator wymaga co najmniej jednego duplikatu poprzedniego wyrażenia regularnego