SORU
16 Mart 2011, ÇARŞAMBA


İsteksiz vs vs İyelik doyumsuz Nicelik

Bu düzenli ifadeler excellent tutorial buldum ve ben sezgisel olarak anlamak ise ne "", "" ve" nicelik, ciddi bir delik olması benim anlayış var. "iyelik isteksiz açgözlü

Ö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 bahsederyemetüm giriş dizesi, mektuplar oldutüketilen, eşleştiricigeri çekilir"foo" olmuştur . oluşumu en sağdaki ^strong>durum mudurvb.

Ne yazık ki, güzel benzetmeler rağmen, hala kim tarafından yenir ne anlamıyorum... açıklayan bir öğretici (kısaca) biliyor Musunuznasıldüzenli ifadeler motorları çalışır?

Eğer birisi biraz farklı cümle olarak aşağıdaki paragrafı açıklayabilir alternatif olarak, bu çok mutluluk duyacağız:

İlk örnek, açgözlü kullanır nicelik belirteci .* bulmak için "bir şey", sıfır ya da daha fazla kez, harfler izledi "f" """".? Ç? Nicelik belirteci olduğu için açgözlü,. * kıssa ifade önce tüm giriş yiyor string. Bu noktada, genel ifade edemiyor, çünkü başarılı son üç harfi ("f" """") o o emildi (kime göre?). Yani eşleştirici yavaş yavaş kapalı ( . yedekler ^strong>sağdan sola?bir mektup en sağdaki geçtiği kadar "" bir durum mudur edilmiştir . foo ^strong>bu ne anlama geliyor?), hangi maçın başarılı nokta arama sona erer.

İkinci örnek, ancak, ilk başlar çok isteksiz, ( . alıcı ^strong>kime göre?) "hiçbir şey". "Foo"çünkü başında görünmüyor dize, yutmak zorunda değil (kimkırlangıçlar?) bu (tetikler "x"), bir ilk mektup 0 ve 4'te ilk maç. Bizim test koşum işlemi kadar devam eder giriş dizesi bitti. Bu 4 ve 13. başka bir eşleşme bulur

Üçüncü bir örnek bulmak için başarısız. nicelik belirteci olduğu için maç iyelik. Bu durumda, tüm giriş dizesi sarıyor .* , (nasıl?) bir şey bırakmadan karşılamak için kalan "sonunda foo ifade. Bir iyelik kullanın nicelik belirteci sizin durumlar için bir şey olmadan ele geçirmek istiyorlar hiç kapalı destek (geri çekil ne anlama geliyor?); daha iyi performans verecektir eşdeğer açgözlü içinde nicelik belirteci maç olmadığı durumlarda hemen bulundu.

CEVAP
16 Mart 2011, ÇARŞAMBA


Bunu bir deneyeceğim.

Biraç gözlünicelik belirteci önce mümkün olduğunca çok uyuyor. Yani .* tüm dize eşleşir. \ \ f şu maç için çalışıyor, ama karakter kaldı. "Yapma doyumsuz nicelik belirteci az maç (bırakarak" o "dize sonunda eşsiz)." backtracks yani Hala yok Maç f normal ifade, yani "backtracks" bir adım daha, yapma doyumsuz nicelik belirteci eşleşen en küçük bir şey daha (bırakmak "oo" sonunda dize eşsiz). Buhala(bırakarak "foo" dize sonunda eşsiz). bir adım daha atmış backtracks bu yüzden düzenli olarak f maç yok Şimdi, bu maçlar sonunda düzenli olarak f kibrit, o sonraki o de eşleştirilir. Başarı!

Biristeksizya da" nicelik belirteci önce mümkün olduğu kadar az olsa maçlar "non-açgözlü Yani .* ilk başta hiçbir şey, tüm dize eşsiz bırakarak maçlar. \ \ f şu maç için çalışır, ama dize eşsiz bir kısmı "x" böylece işe yaramıyor. ile başlar \ \ , Doyumsuz nicelik belirteci eşleşmeyi bir şey daha yapma backtracks (şimdi uyuyor "x", "fooxxxxxxfoo" eşsiz) bıraktı. Başarılı olan f, ve o maç için çalışır ve sonraki 13* *normal ifade maçta çok sonra. Başarı!

Örnek, daha sonra üzerinde işlem aynı işlem aşağıdaki dizenin kalan eşsiz bir bölümü ile başlar.

Biriyeliknicelik belirteci sadece doyumsuz nicelik belirteci gibi, ama geri gelmiyor. .* tüm eşleşen dize ile, hiçbir şey eşsiz bırakarak başlar. Sonra hiçbir şey normal ifade f ile maç kaldı. İyelik nicelik belirteci geri gelmez bu yana, maçı orada başarısız olur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chilla Frilla™

    Chilla Frill

    7 Aralık 2006
  • FOSDEM

    FOSDEM

    13 Ocak 2009
  • Glyn Dewis

    Glyn Dewis

    25 AĞUSTOS 2007

İLGİLİ SORU / CEVAPLAR