Jaka jest różnica pomiędzy:
(.+?)
i
(.*?)
kiedy używam go w moim preg_match
wyrażeniu regularnym php ?
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.*?
Pierwsza (
+
) to co najmniej jeden znak . Druga (*
) zawiera zero lub więcej znaków . Obie nie są chciwe (?
) i pasują do wszystkiego (.
).źródło
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.źródło
+
dopasowuje co najmniej jeden znak*
dopasowuje dowolną liczbę (w tym 0) znakówZnak
?
wskazuje na leniwe wyrażenie, więc dopasuje jak najmniej znaków.źródło
Rozważ poniżej, jaki ciąg ma pasować.
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.+)
źródło
+
jest jedynką minimalną,*
może też wynosić zero.źródło
"+ is minimal one"
co to zdanie oznacza?W wyrażeniu regularnym
{i,f}
oznacza „międzyi
dof
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 4Wię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
źródło
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.
źródło
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 obu5 and 15
. Różnica polega na tym, że+
operator wymaga co najmniej jednego duplikatu poprzedniego wyrażenia regularnegoźródło