2009-08-20 15 views
397

mam duży plik HTML, który ma wiele znaczników, które wygląda następująco:Jak mogę sprawić, by mój mecz nie był chciwy w vimie?

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

Próbuję zrobić Vima wyszukiwania i zamiany, aby pozbyć się wszystkich class="" i style="" ale jestem mając trudności z niedopasowaniem meczu.

Moja pierwsza próba była to

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

ale Vim nie wydaje się podoba ?. Niestety usunięcie ? powoduje, że mecz jest zbyt chciwy.

Jak mogę poprawić moją zgodność?

+0

myślę Odpowiedź Pawła jest dobra. Wystarczy powiedzieć "?" nie oznacza opcjonalnego w vim (jeśli jest to, co chcesz osiągnąć przy użyciu "?") – LB40

+11

@LB, w wielu językach,. *? oznacza dopasować dowolną postać, ale nie być chciwym. Właśnie tego próbuje osiągnąć. –

Odpowiedz

608

Zamiast .* użytku .\{-}.

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

Patrz także :help non-greedy

+1

Jeśli ': help non-chciwy' nie działa, spróbuj': help/\ {- ' –

+21

Niezbyt intuicyjny, czy jest to coś, co robi tylko vim? –

+7

Tak. Vim ma swój własny język wyrażeń regularnych. –

40

Co z

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

Nic! Nic w ogóle nie tak! :) –

+3

Chociaż, dla mojej własnej korzyści, nadal chciałbym lepiej zrozumieć tę nieuporządkowaną rzecz. –

+1

@ Mark, po prostu dodano notatkę do mojej odpowiedzi na temat wspaniałego rozdziału dotyczącego wyrażeń regularnych, który obejmuje to w książce "sed & awk" –

9

Odkryłam, że to dobre rozwiązanie do tego typu pytanie jest:

 
:%!sed ... 

(lub Perl, jeśli wolisz). IOW, zamiast poznawać osobliwości wyrażeń regularnych, używa narzędzia, które już znasz. Użycie perla spowodowałoby? modyfikator działa, aby nie dopasować meczu.

+2

dobry punkt, ale będąc w stanie zrobić "/ pattern", aby sprawdzić, czy pasujesz do wzorca poprawnie przed zastosowaniem i używanie modyfikatora "c" w twoim regularnym wyrażeniu vim jest również miłe :) –

+0

to jest poprawne. wszystkie rozwiązania tutaj nie są bliskie chciwości! jeśli musisz dopasować [0-9] \ {7} w linii z dużą ilością tekstu i kilkoma wystąpieniami tego wzorca, żadne rozwiązanie tutaj nie będzie. Rozwiązania tutaj działają tylko dla prostych rzeczy (które mają być uczciwe, to jest pytanie). ale jeśli robisz coś więcej niż przeszukiwanie do następnego cytatu, vim nie pomoże. – gcb

-2

G'day,

przetwarzanie regexp Vim nie jest zbyt błyskotliwy. Odkryłem, że składnia regexp dla sed jest o właściwym dopasowaniu do możliwości vima.

Zazwyczaj ustawiam podświetlanie wyszukiwania na (: set hlsearch), a następnie odtwarzam z regexp po wprowadzeniu ukośnika, aby przejść do trybu wyszukiwania.

Edit: Znak, że sztuczka, aby zminimalizować chciwy dopasowania jest również objęte w doskonałej książce Dale Dougherty za "Sed & Awk" (sanitised Amazon link).

Rozdział trzeci "Zrozumienie składni wyrażenia regularnego" to doskonałe wprowadzenie do bardziej prymitywnych możliwości wyrażeń regularnych związanych z sed i awk. Tylko krótki odczyt i bardzo zalecane.

HTH

okrzyki,

+6

Przetwarzanie wyrażeń regularnych Vima jest całkiem niezłe. Może robić rzeczy, których nie może osiągnąć sed, np. Dopasowanie liczb na linii/kolumn lub dopasowanie w oparciu o klasyfikację znaków w języku jako słów kluczowych lub identyfikatorów lub białych znaków. Posiada również zerowe szerokości i możliwość umieszczania wyrażeń po prawej stronie zamiennika. Jeśli użyjesz '\ v', pomoże to w wyczyszczeniu składni. –

+0

@Brian, okrzyki. Zrobię regex i zobaczę, czego mi brakuje. –

45

dla chciwego wyszukiwania w vim odbywa się za pomocą {-} operatora.Tak:

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

po prostu spróbuj:

:help non-greedy 
13

Jeśli jesteś bardziej komfortowe składni regex PCRE, który

  1. obsługuje operator nie chciwy, jak prosiłeś w PO ; i
  2. nie wymaga operatorów grupowania wstecznego i liczności (absolutnie sprzeczne z wymaganiami składni vim, ponieważ nie dopasowujesz literalnych znaków, ale określasz operatorów); i
  3. masz [g] vim skompilowana z Perl funkcji, badanie przy użyciu

    : Wersja i sprawdzić możliwości; Gdy + Perl jest tam jesteś dobry, aby przejść)

wyszukiwania try/zastąpić stosując

:perldo s/// 

przykładem. Zmienne src i alt atrybut w znaczniku IMG:

<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

Z \v (jak zasugerowano w kilku komentarzach)

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