Düzenli ifadeler üzerinde bu mükemmel öğreticiyi buldum ve sezgisel olarak "açgözlü", "isteksiz" ve "iyelik" nicelleştiricilerin ne yaptığını anlasam da, anlayışımda ciddi bir delik var gibi görünüyor.
Özellikle, aşağıdaki örnekte:
Enter your regex: .*foo // greedy quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.
Enter your regex: .*?foo // reluctant quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.
Enter your regex: .*+foo // possessive quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.
Açıklama bahseder yeme , harfler edilmiş Tüm giriş dizesini tüketilen matcher, kapalı destek , "foo" nin en sağdaki oluşum olmuştur regurgitated vb
Ne yazık ki, güzel metaforlara rağmen, hala kim tarafından ne yendiğini anlamıyorum ... Normal ifadelerin motorlarının nasıl çalıştığını açıklayan (kısaca) başka bir öğretici biliyor musunuz ?
Alternatif olarak, bir kişi aşağıdaki paragrafı biraz farklı bir ifadeyle açıklayabilirse, bu çok takdir edilecektir:
İlk örnek, sıfır veya daha fazla kez "herhangi bir şey" bulmak için açgözlü niceleyiciyi kullanır. * Ve ardından "f" "o" "o" harfleri. Nicelik belirteci açgözlü olduğu için, ifadenin. * Kısmı önce tüm girdi dizesini yer. Bu noktada, genel ifade başarılı olamaz, çünkü son üç harf ("f" "o" "o") zaten tüketilmiştir ( kim tarafından? ). Böylece eşleştirici yavaş yavaş ( sağdan sola mı? ) "Foo" nun en sağdaki oluşumunun yeniden oluşmasına ( bu ne anlama geliyor? ) Kadar her seferinde geri çekilir , bu noktada maç başarılı olur ve arama sona erer.
Bununla birlikte, ikinci örnek isteksizdir, bu yüzden ilk önce ( kim tarafından? ) "Hiçbir şey" tüketerek başlar . Dizenin başında "foo" görünmediğinden , ilk maçı 0 ve 4'te tetikleyen ilk harfi (bir "x") yutmak ( kim yutar?) giriş dizesi bitene kadar. 4 ve 13'te başka bir maç bulur.
Üçüncü örnek, nicelik belirteci sahip olduğu için eşleşme bulamıyor. Bu durumda, giriş dizesinin tamamı. * +, ( Nasıl? ) Tarafından kullanılır ve ifadenin sonunda "foo" yu tatmin edecek hiçbir şey kalmaz. Hiçbir şeyi geri çekmeden ele geçirmek istediğiniz durumlar için iyeliksel bir nicelik belirteci kullanın ( geri çekilme ne demektir? ); eşleşmenin hemen bulunmadığı durumlarda eşdeğer açgözlü niceleyiciden daha iyi performans gösterir.
*
,+
ve?
vardır açgözlü. Minimal nicelik gibi*?
,+?
ve??
vardır tembel. İyelik nicelik gibi*+
,++
ve?+
vardır yapışkan.