2013-08-22 10 views
36

Nadal nie jestem tak przyzwyczajony do składni regex vima. Mam ten kod:Vim pozytywny wcześniejszy regex

rename_column :keywords, :textline_two_id_4, :textline_two_id_4 

chciałbym aby dopasować ostatni id z pozytywnym uprzedzona w składni regex VIMS.

Jak to zrobić?

\[email protected]=_\d$ 

To nie działa.

Ta składnia Perl działa:

id(?=_\d$) 

Edycja - odpowiedź:

/id\(_\d$\)\@= 

Może ktoś wyjaśnić składnię?

Odpowiedz

50

Jeśli zaznaczysz pomocy vim, nie ma wiele do wyjaśnienia: (:h \@=)

\@=  Matches the preceding atom with zero width. {not in Vi} 
     Like "(?=pattern)" in Perl. 
     Example    matches 
     foo\(bar\)\@=  "foo" in "foobar" 
     foo\(bar\)\@=foo nothing 

ta powinna być zgodna z ostatnią ID:

/id\(_\d$\)\@= 

zaoszczędzić trochę z powrotem ukośniki z „bardzo magia „:

/\vid(_\d$)@= 

rzeczywiście, wygląda bardziej proste w użyciu vim na \zs \ze:

id\ze_\d$ 
+0

Dzięki. Dlaczego muszę otaczać tekst przed \ @ = z()? – Hendrik

+1

@Hendrik bez '()' jak może znać silnik regex, która część jest częścią pasującą do szerokości zero? – Kent

+2

@ Hendrik nawiasy są konieczne, jeśli rzeczy przed wyprzedzeniem są grupą atomów. W twoim przypadku masz trzy atomy: '_',' \ d' i '$'. Zatem bez nawiasów, poprzednia strona szuka tylko "$", które nie jest zbyt użyteczne. Nawiasy traktowane są jak jeden atom, dzięki czemu możesz wyprzedzić '_ \ d $' – FDinoff