Bu Perl uyumlu düzenli ifadeler arasındaki fark nedir?

5 Cevap php

Dan bir cevap another question merakımı uyandırdı.

Düşünün:

$string = "olarakfolarakdfolarakdfolarakdfolarakdf[[sometextomatch]]olarakfkjolarakdfjolarakkldfj";

$regex = "/\[\[(.+?)\]\]/";
preg_match($regex, $string, $matches);

$regex = "/\[\[(.*)\]\]/"; 
preg_match($regex, $string, $matches);

I olarakked what the difference between the two regexes is. The olarakwer I got wolarak that ".*" matches any character 0 or more times olarak many times olarak possible, and ".+?" matches any character 1 or more times olarak few times olarak possible.

Ben bu yüzden biraz kendi üzerinde deney ancak herhangi bir sonuç gelmedi mi farklı bu ifadelerin okuyun. Php.net "diyor?" {0,1} eşdeğerdir yüzden yazabilirsiniz

"/\[\[(.+?)\]\]/"

olarak

"/\[\[((.+){0,1})\]\]/"

or olarak

"/\[\[(.{0,})\]\]/"

or olarak

"/\[\[(.*)\]\]/"

Onlar farklı bir metin yakalamak mı? Bir daha pahalı fark nedir? Ben anal davranıyor muyum?

5 Cevap

Farklı sonuçlar elde nerede Sadece bir örnek almak:

foo [[bar]] baz [[quux]]

Ikincisi sadece [[bar]] baz [[quux]] maç olacak iken ilk düzenli ifade [[bar]] maç ve [[quux]] olacaktır.

Bunun nedeni, bir tembel quantifier, normal açgözlü modu mümkün tekrar maksimum maç olacak olası tekrarlar az maç olacak (? ile sonlandırılmış) olduğunu:

Bir nicelik soru işareti takip Ancak, eğer, o zaman açgözlü olmaktan çıkar ve bunun yerine olası kez az sayıda eşleşen, yani desen /\*.*?\*/ C yorumlarla doğru olanı yapar. Çeşitli Nicelik anlamı, aksi takdirde, kibrit sadece tercih edilen sayısı değiştirilmez. Kendi başına bir nicelik olarak kullanımı ile soru işareti bu kullanımını karıştırmayın. Iki faydası vardır, çünkü bazen \d??\d tercihinize göre bir rakamla eşleşir gibi, iki katına görünebilir, ancak bu modelin kalan maçları tek yolu ise iki maç olabilir.

O * gibi bir şey şu zaman, ? [(0)] {+, ancak, {0,1} demek Stand-alone }, ya da {3,6} (örneğin), ? minimal eşleme yapar, hangi tamamen başka bir şey anlamına gelir. Yani, hayır, /\[\[(.+?)\]\]/ /\[\[((.+){0,1})\]\]/ olarak yeniden olamaz. :-)

Normal olarak, ? ", bir önceki şeyi, 0 ya da 1 defa yakalama" anlamına gelir. A * ya da + sonra kullanılabilir, ancak, bir ? * ya da + anlamını değiştirir . Normal olarak, * / + "(+ 1) maç, 0 ya da daha fazla kez, ve mümkün olduğu kadar çok uygun" anlamına gelir. ? ekleme ki "(+ 1) maç 0 veya daha fazla kez, ama mümkün olduğunca az maç" olmak anlam değiştirir. Varsayılan olarak bu ifadeleri "açgözlü" olarak, ? onları olmayan açgözlü olmak değiştirir.

? sadece bunu bir kez ((0,1) 1 kez 0 anlamına gelir) çekeceği nereye kadar o oluşur gibi * bunu birçok kez ele geçirecek dize.

Dan this page:

Eğer <.+> almak ve The <em>Big</em> Dog. o <em>Big</em> verecek onu kullanın. Nerede gibi <.+?> sadece maç olacak <em>

/.*/   ===  /.{0,}/
/.+/   ===  /.{1,}/
/.?/   ===  /.{0,1}/

"aaaaaa" =~ /a*/;  # "aaaaaa"
"aaaaaa" =~ /a*?/; # ""