Maçımı vim'de nasıl açgözlü yapabilirim?


479

Ben böyle görünüyor biçimlendirme çok büyük bir HTML dosyası var:

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

Bir Vim yapmaya çalışıyor arama ve değiştir tüm kurtulmak ediyorum class=""ve style=""fakat sorun maç ungreedy yapma yaşıyorum.

İlk denemem şuydu

%s/style=".*?"//g

ama Vim hoşlanmıyor gibi görünüyor ?. Maalesef ?maçı kaldırmak çok açgözlü.

Maçımı nasıl aciz yapabilirim?


Bence Paul'ün cevabı iyi. Sadece "?"
vim'de

14
@LB, birçok dilde,. *? herhangi bir karakterle eşleşmek, ancak açgözlü olmamak anlamına gelir. Bunu başarmaya çalışıyor.
Randy Morris

Yanıtlar:


734

Yerine .*kullanımı .\{-}.

%s/style=".\{-}"//g

Ayrıca bkz. :help non-greedy


37
Çok sezgisel değil, bu sadece vim'in yaptığı bir şey mi?
Ehtesh Choudhury

94
Her şeyin kendine özgü ifade dili vardır ... bu normal ifade ile ilgili en büyük sorunlardan biridir.
Patrick Farrell

35
Bu araçların birçoğu aynı zamanda olgunlaştı ve düzenli bir ifade dilinin kendi lehçesini bağımsız olarak geliştirdi. Bu araçların birçoğu da farklı sorunları çözmeye çalışıyordu, bu nedenle sözdiziminin bu uygulamalar arasında potansiyel olarak çılgınca farklı olabileceği mantıklı. Kabul etmeliyiz ki, gerçek hayat bazen geliştiriciler olarak hayatımızı zorlaştırsa da, gerçek dünya böyle çalışır. Neyse ki birçok araç bu günlerde en azından Perl uyumlu regex uygulamasını sağlıyor. Ne yazık ki Vim onlardan biri değil.
Randy Morris

15
Eğer benim gibi biri aramalarını varsayılan olarak \v(çok sihirli bayrak) kullanırsa kullanmak isteyeceksiniz .{-}.
jgillman

48
@Shurane @Ziggy Mnemonic: {1,3}yaptığı gibi tekrarların sayısını kontrol eder (diş telleri). Eksi işareti şu -anlama gelir: olabildiğince az tekrarlayın (az == eksi);)
Ciro Santilli :0 冠状 病 六四 事件 法轮功

58

Vim'de açgözlü olmayan arama {-} operatörü kullanılarak yapılır. Bunun gibi:

%s/style=".\{-}"//g

sadece dene:

:help non-greedy

48

Sorun ne

%s/style="[^"]*"//g

7
Her ne kadar, kendi yararım için, hala ungreedy şeyi daha iyi anlamak istiyorum.
Mark Biek

17

PCRE regex sözdizimi daha rahatsa,

  1. OP'de sorduğunuz gibi açgözlü olmayan operatörü destekler; ve
  2. geri sarmalı gruplama ve kardinalite operatörleri gerektirmez (değişmez karakterlerle eşleşmediğiniz, operatörleri belirlediğiniz için tamamen sezgisel bir vim sözdizimi gereksinimi); ve
  3. perl özelliği ile derlenmiş [g] vim var, test kullanarak

    : özellikleri ver ve denetle; + perl varsa, gitmekte fayda var)

kullanarak aramayı / değiştirmeyi dene

:perldo s///

Misal. İmg etiketinde src ve alt özelliklerini değiştirin:

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>

1
perldoharika çalışıyor, ancak ne yazık ki normal ifadeyi yazarken seçilen testi vurgulamıyor.
mljrg

12

Bu tür bir soru için iyi bir çözüm olduğunu buldum:

:%! sed ...

(veya isterseniz perl). IOW, vim'in normal ifade özelliklerini öğrenmek yerine, zaten bildiğiniz bir aracı kullanın. Perl kullanmak? maç değiştirici maç ungreedy.


2
iyi bir nokta, ancak vim normal ifadenizde değiştirici /patternkullanmadan ve modelini kullanmadan önce deseni doğru bir şekilde eşleştirdiğinizi kontrol edebilmek cde güzel :)
João Portela 30:00

doğru. buradaki tüm çözümler açgözlü değil! [0-9] \ {7} metnini çok sayıda metin ve bu desenin birkaç kez tekrarlanmasıyla eşleştirmek zorunda kalırsanız, burada hiçbir çözüm olmaz. Buradaki çözümler sadece basit şeyler için işe yarıyor (adil olmak gerekirse, sorulan şey budur). ancak bir sonraki teklife kadar arama yapmaktan biraz daha fazlasını yapıyorsanız, vim yardımcı olmaz.
gcb

4

İle \v(birkaç yorumda önerildiği gibi)

:%s/\v(style|class)\=".{-}"//g


-4

İyi günler,

Vim'in normal ifade işlemi çok parlak değil. Sed için regexp sözdiziminin vim yetenekleri için doğru eşleşme olduğunu buldum.

Genellikle arama vurgulamasını açık olarak ayarladım (: set hlsearch) ve sonra arama moduna girmek için eğik çizgi girdikten sonra normal ifade ile oynuyorum.

Edit: Mark, açgözlü eşleşmeyi en aza indirmek için hile Dale Dougherty mükemmel kitap "Sed & Awk" ( dezenfekte Amazon bağlantı ) kapsamındadır.

Üçüncü Bölüm "Düzenli İfade Sözdizimini Anlamak" sed ve awk ile ilgili daha ilkel normal ifade yeteneklerine mükemmel bir giriş niteliğindedir. Sadece kısa bir okuma ve tavsiye.

HTH

şerefe,


7
Vim'in normal ifade işlemesi aslında oldukça güzel. Sat'ın satır / sütun numaralarında eşleme veya karakterlerin anahtar kelimeler veya tanımlayıcılar veya boşluk olarak dil başına sınıflandırmasına göre eşleme gibi yapamayacağı şeyler yapabilir. Ayrıca, sıfır genişlikli iddialara ve bir değiştirmenin sağ tarafına ifadeler koyma yeteneğine sahiptir. Eğer kullanırsanız \vbu bir sürü kadar sözdizimi temizlemeye yardımcı olur.
Brian Carper

1
@Brian, şerefe. Regex'e yardım edeceğim ve neyi kaçırdığımı göreceğim.
Rob Wells

Gerçekten çok iyi bir kitap imho olan @RobWells, Sed & Awk , açgözlü / tembel nicelik belirteçlere açıkça hiçbir kelime harcamıyor . Bir kanıt olarak, kitapta açgözlülük veya açgözlü kelimelerin kesinlikle ortaya çıkması yoktur ve tembel sözcüğün sadece bir, ancak ilgisiz oluşumu vardır .
Enrico Maria De Angelis

@EnricoMariaDeAngelis ama örnek açıkça terimi ifade etmiyor. Regex'inizi açgözlü olmayan eşleşmeler için "değil" operatörünü kullanacak şekilde nasıl uyarlayacağınızla ilgilidir. Açgözlü ve tembel terimi, açgözlü maç davranışını özel olarak değiştirmek için operatörleri tanıttıklarında Perl'in NFA motoruyla geldi.
Rob Wells
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.