2012-12-14 46 views
8

使用VIM 7.2,對於這樣的文字:VIM圖案而不另一個給定令牌匹配兩個令牌其間

FOO FOO 令牌 FOO FOO countertoken FOO FOO 令牌 FOO 目標 FOO FOO countertoken foo

我想ma tch每個字符串以'token'開頭並以'target'結尾,不包含包含'countertoken'。

所以,在上面的例子中,我要匹配這樣的:

富富令牌富富countertoken富富令牌富目標富富countertoken富

此:

foo foo 令牌fo Ø富countertoken富富 令牌富目標富富富countertoken

(這樣做的原因是,在實踐中,我在尋找長期的文件和我之前很感興趣,最後的「令牌」 '目標'。令牌有點像XML標籤,但它不是XML,所以XML工具沒有幫助。我知道我可以使用\zs,所以光標落在'目標'上,然後向後搜索'標記',但肯定有一個一步的解決方案!)

我希望像這樣的工作,但它doesn' T:

/token\(.*countertoken.*\)\@!*target 

有很多這樣的事件我感興趣的,當然,我在尋找的文件是不是真的充滿了東西定期爲「富」。

在vim中是否有這樣的單行正則表達式?

回答

1

如果您只是對最後的token感興趣,您不必關心countertoken。 一種可能性是尋找最後發生的token並匹配所有內容,直到下一個target

/.*\zs\(token\).\{-}\(target\) 

說明:

  • .*\zs - 最後一次出現匹配。
  • \(token\) - 匹配字符串「令牌」
  • .\{-}比賽非貪婪
  • \(target\) - 匹配字符串「目標」
+0

謝謝,但這並不考慮到最後出現的可能包括「 countertoken」。我意識到我應該澄清一下:我感興趣的字符串會在文件中出現多次,並且它們中的任何一個都可能包含或不包含countertoken - 我不感興趣的時候。我編輯了這個問題。 –