Bir maçta daha kısa maçları tercih eden normal ifade? (Bu, açgözlü olmayanlardan daha fazladır)


9

Bir arabellek içinde bulanık arama yapmak için bir komut dosyası oluşturmaya çalışıyorum. Ana fikir bazı girdi almak ve .\{-}her karakter çifti arasına eklemek , örneğin fooolur f.\{-}o.\{-}o.

Bu oldukça iyi çalışıyor, ancak pek çok ideal olmayan eşleşme ortaya çıkıyor. Bence bulanık bir arama önce en kısa eşleşmeleri vermelidir. Aşağıdaki örneği düşünün:

public void put()

put(Böylece p.\{-}u.\{-}t) için bulanık bir arama yapmak tüm dizeyle eşleşir public void put, ancak putbu eşleşme içinde daha kısa olan daha yararlı olur.

Açgözlü olmayan operatör, daha önce sona eren eşleşmeleri bulmakta iyidir , ancak aynı zamanda daha sonra başlayan eşleşmeleri tercih edebilecek bir şeye ihtiyacım var . Kavramsal olarak, her iki yönde de açgözlü olmamalıdır. Mümkün mü?


Ayrıca bakınız: stackoverflow.com/q/15191291 (ne yazık ki sorunuza cevap yok)
Doorknob

1
@Doorknob, cevap yok, ama iyi bir noktaya işaret ediyor: Regex bir dizenin ortasından aramaya başlamıyor. İşi yapmak için bazı VimScript'leri dahil etmem gerekebilir. (Uzun) eşleşmeyi tersine çevirme ve tersine çevrilmiş desen için arama fikrini araştırıyorum.
tommcdo

2
Tim Pope bugün vim-haystack yayınladı . İhtiyacınız olana benzer. Belki ondan ilham alabilir, hatta kullanabilirsiniz.
tokoyami

1
Maçın mümkün olduğunca geç başlamasını ve kalıbı tatmin ederken olabildiğince erken bitmesini istiyorum.
tommcdo

1
Yaklaşık dize eşleme algoritmalarına bir göz atmalısınız, bulanık bulucuyu uygulamak için normal ifadelerden daha uygun araçlardır.
toro2k

Yanıtlar:


2

Yeterli örnek yok ama bence bu istediğini yapıyor.

.*\zsp.\{-}u.\{-}t

putyerine örneğinizde eşleşir public void put. Temel olarak .*normal ifade motorunu dizeyi geriye doğru aramaya zorlar, çünkü .*en son eşleşmeyi bulmak için önce tüm dizeyi sonra geri izler tüketirp.\{-}u.\{-}t


Bunu daha önce denemiştim (ama şimdiye kadar unuttum). Oldukça iyi, ama her satırda sadece bir maç olacağı anlamına geliyor (mümkün olan son maç). Hâlâ pouty puppetiki maç vermek isteyen bir çizgi istiyorum .
tommcdo
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.