Arasındaki fark nedir:
(.+?)
ve
(.*?)
php'mde kullandığımda preg_match regex'imde kullandığımda?
Arasındaki fark nedir:
(.+?)
ve
(.*?)
php'mde kullandığımda preg_match regex'imde kullandığımda?
Yanıtlar:
Nicelik belirteçleri olarak adlandırılırlar.
* Önceki ifadenin 0 veya daha fazlası
+ Önceki ifadenin 1 veya daha fazlası
Varsayılan olarak nicelik belirteci açgözlüdür, yani mümkün olduğunca çok karakterle eşleşir.
?Niceleyicinin sonra, "ungreedy" o mümkün olduğunca az maç olacak demektir bu niceleyici yapmak davranışını değiştirir.
Örnek açgözlü / huysuz
Örneğin " abab " dizesinde
a.*b "abab" ile eşleşecek (preg_match_all bir eşleşme döndürür, "abab")
while a.*?byalnızca başlangıç "ab" ile eşleşir (preg_match_all iki eşleşme döndürür, "ab")
Normal ifadelerinizi çevrimiçi olarak örneğin Regexr'de test edebilirsiniz, buradaki açgözlü örneğe bakın
(.+?)ve (.*?)olan normal ifadelerin bir değişik pozisyonda farklı davranır a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
.*mümkün olduğunca çok eşleşecek. Mümkün olduğu kadar erken durdurmak istiyorsanız, bunu umursamaz hale getirmelisiniz.*?
A , önceki modelin bir veya daha fazla örneğiyle +eşleşir . A, sıfır veya daha fazlasıyla eşleşir* , önceki modelin örneğiyle .
Yani temel olarak, eğer a kullanırsanız +, desenin en az bir örneği olmalıdır, eğer kullanırsanız *, hiçbir örneği yoksa yine de eşleşecektir.
+ en az bir karakterle eşleşir
* herhangi bir sayıda (0 dahil) karakterle eşleşir
?Mümkün olduğunca az karakter olarak maç olacak, böylece tembel ifadesini gösterir.
Eşleşecek dizeyi aşağıda düşünün.
ab
Desen (ab.*) , sonuç olarak yakalama grubu için bir eşleşme döndürür:ab
Desen (ab.+)eşleşmeyecek ve hiçbir şey döndürmeyecek.
Ancak dizeyi takip edecek şekilde değiştirirseniz, abakalıp için geri dönecektir .(ab.+)
aba
RegEx'in yılında {i,f}"arasındaki gelir iiçin fmaçları". Aşağıdaki örneklere bir göz atalım:
{3,7} 3 ila 7 eşleşme anlamına gelir {,10} alt sınır olmadan en fazla 10 eşleşme anlamına gelir (yani alt sınır 0'dır){3,} üst sınırı olmayan en az 3 eşleşme anlamına gelir (yani üst sınır sonsuzdur){,} eşleşme sayısı için üst sınır veya alt sınır olmadığı anlamına gelir (yani alt sınır 0 ve üst sınır sonsuzdur){5} tam olarak 4 anlamına gelir Çoğu iyi dil kısaltmalar içerir, RegEx de öyle:
+ kısaltmasıdır {1,}* kısaltmasıdır {,}? kısaltmasıdır {,1}Bu +, en az 1 eşleşme gerektirirken, *herhangi bir sayıda eşleşme kabul edilir veya hiç eşleşme olmaz ve ?1 eşleşme veya sıfır eşleşmeden fazlasını kabul etmez.
Kredi: Codecademy.com
Bir yıldız, artıya çok benzer, tek fark, artı önceki karakter / gruptan 1 veya daha fazlasıyla eşleşirken yıldızın 0 veya daha fazlasıyla eşleşmesidir.
Önceki cevapların basit bir örneği vurgulamakta başarısız olduğunu düşünüyorum:
örneğin bir dizimiz var:
numbers = [5, 15]
Şu normal ifade ifadesi ^[0-9]+eşleşir: 15only. Ancak ^[0-9]*ikisiyle de eşleşir 5 and 15. Aradaki fark, +operatörün önceki normal ifade ifadesinin en az bir kopyasını gerektirmesidir