2013-08-22 33 views
36

Tôi vẫn chưa quen với cú pháp vim regex. Tôi có mã này:Vim tích cực lookahead regex

rename_column :keywords, :textline_two_id_4, :textline_two_id_4 

Tôi muốn đối sánh id cuối cùng với dấu hiệu tích cực trong cú pháp regex VIM.

Bạn sẽ làm như thế nào?

\[email protected]=_\d$ 

Điều này không có tác dụng. làm việc

cú pháp perl này:

id(?=_\d$) 

Edit - câu trả lời:

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

Ai đó có thể giải thích cú pháp?

Trả lời

50

Nếu bạn kiểm tra sự giúp đỡ vim, không có nhiều để giải thích: (: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 

này phải phù hợp với id cuối cùng:

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

tiết kiệm một số dấu back slash với "rất kỳ diệu ":

/\vid(_\d$)@= 

thực sự, có vẻ đơn giản hơn khi sử dụng vim's \zs \ze:

id\ze_\d$ 
+0

Cảm ơn. Tại sao tôi phải bao quanh văn bản trước \ @ = với()? – Hendrik

+1

@Hendrik không có '()' làm thế nào mà động cơ regex có thể biết, phần nào là phần khớp với chiều rộng bằng không? – Kent

+2

@Hendrik các dấu ngoặc đơn là cần thiết nếu những thứ trước mặt cái nhìn là một nhóm các nguyên tử. Trong trường hợp của bạn, bạn có ba nguyên tử '_',' \ d' và '$'. Vì vậy, nếu không có các dấu ngoặc đơn, lookahead chỉ tìm kiếm một '$' mà không phải là rất hữu ích. Các dấu ngoặc đơn được coi là một nguyên tử để bạn có thể tra cứu cho '_ \ d $' – FDinoff

Các vấn đề liên quan