Regex artı vs yıldız farkı?


91

Arasındaki fark nedir:

(.+?)

ve

(.*?)

php'mde kullandığımda preg_match regex'imde kullandığımda?

Yanıtlar:


150

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


2
"tembel", "çaresizlik" için daha yaygın bir terimdir
Walter Tross

Örnek yanlıştır. Hem (.+?)ve (.*?)olan normal ifadelerin bir değişik pozisyonda farklı davranır a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
Louis55

Neden a. * B "ab" yi geri vermiyor? "A ve b arasında, 0 veya daha fazla karakter içeren kelime" demiyor mu, bu nedenle, ab sıfır karaktere sahiptir ve bir eşleşme olabilir. Bu neden yanlış?
Merhaba Dünya

@ HelloWorld, bunun yukarıda anlattığım açgözlülükle ilgisi var. .*mümkün olduğunca çok eşleşecek. Mümkün olduğu kadar erken durdurmak istiyorsanız, bunu umursamaz hale getirmelisiniz.*?
stema

22

İlki ( +) bir veya daha fazla karakterdir . İkinci ( *) sıfır veya daha fazla karakterdir . Her ikisi de açgözlü değildir ( ?) ve herhangi bir şeyle eşleşir ( .).


1
Bu, s değiştiricisinin ayarlanıp ayarlanmadığına bağlıdır.
Quentin

8

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.


8

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


8

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

Sanırım bu, özellikle + vs * sorusuna daha iyi cevap
Terrence

6

+minimum bir, *sıfır da olabilir.


"+ is minimal one"bu cümle ne anlama geliyor?
Det

5

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


4

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.


2

Ö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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.