2011-04-26 526 views
2

我試圖刪除從第二個字符到最後一個.word\模式(也刪除點)的所有文本行,但在點之前可能沒有\。如果在點之前有\,則刪除直到之前的.word\模式。VIM:正則表達式 zs ze問題

我創造了這個簡單的正則表達式:
^\w\zs.*[^\]\.\ze\w\+\\\s.*$
但這不起作用

我是怎麼了?

如果我不想刪除,直到最後.word\但是直到第二個.word\模式,代碼會是什麼?

數據:
nnoremenu <silent> 97.330.10 &Sort.Reverse\ Characters.Reverse\ Characters\ in\ Line\ Hor\ -[A]<Tab>sihT\ si\ ym\ txet\.\
nnoremenu <silent> 97.330.11 &Sort.Reverse\ Characters.Reverse\ Characters\ in\ Line\ Hor\ Reverse\ -[A]<Tab>\.txet\ ym\ si\ sihT\

必須是:
n Reverse\ Characters\ in\ Line\ Hor\ -[A]<Tab>sihT\ si\ ym\ txet\.\
n Reverse\ Characters\ in\ Line\ Hor\ Reverse\ -[A]<Tab>\.txet\ ym\ si\ sihT\

+2

一些示例數據可能會有幫助。 – johnny 2011-04-26 10:15:55

+3

有些數據是強制性的。你不能指望我們閱讀(證明)錯誤的正則表達式,並猜測你的意思是不完整的描述 – sehe 2011-04-26 10:18:10

+0

@johnny,@sehe,請看上面 – Reman 2011-04-26 13:20:25

回答

2

你應該使用:

:%s/^\w\zs.*\\\@<!\.\ze\w\+\\\s 

注意,最終\s意味着你需要在最後一個反斜槓後的空間。

\@<!幫手意味着:lookbehind否定斷言(請參閱:help /\@<!)。

另外請注意,最後.*$是無用的。

+0

謝謝。這解決了我的第一個問題。我們的正則表達式總是選擇最新的模式'w \ + \\ s',選擇第二個模式的代碼是什麼?體育如果我在文本p.e中搜索找到2個或更多空格。 '^ [a | v | n]。* \(\ s \ {2,} \)\ {1}',它會找到一行中的最後2個或更多個空格。如何搜索一行中的前兩個或更多空格? – Reman 2011-04-26 13:27:12

+0

用途:'\(^。\ { - } \ {2,} \ @ = \)\ @> \ zs'。看到':help/\ @>'這些東西。 – Benoit 2011-04-26 13:29:37

+0

感謝Benoit,解決了我的問題。順便說一句:爲什麼這不起作用:'^ [a | v | n]。* \(\ s \ {2,} \)\ {1}'是不是和你的代碼一樣?你的代碼有效,我的代碼不會:) – Reman 2011-04-26 14:57:03