2013-08-19 38 views
10

我最近遇到了Vim regex builtins中的分支說明符。在\& Vim的幫助部分包含此:什麼是Vim的正則表達式中的模式

A branch is one or more concats, separated by "\&". It matches the last 
concat, but only if all the preceding concats also match at the same 
position. Examples: 
     "foobeep\&..." matches "foo" in "foobeep". 
     ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob" 

目前尚不清楚它是如何使用,並且用途。對它做什麼以及如何使用它的一個很好的解釋會很好。

需要明確的是,這是不&(與全匹配替換)在取代所使用的,這是在一個圖案中使用的\&

實例:

/\c\v([^aeiou]&\a){4} 

用於搜索連續4個輔音(從VIM提示兩者)。

+0

如果可以鏈接到您已經閱讀過的wiki或手冊頁,那將會很棒嗎? –

+0

@Sniffer':幫助模式'。 – mhinz

+0

@mhinz我在這個時候運行Windows,我沒有VIM,但無論如何,你似乎知道答案,所以它很好。謝謝。 –

回答

14

說明:

\&\|,在運營商是對操作什麼。因此,兩個連接都必須匹配,但只有最後一個會突出顯示。

實施例1:

(以下測試假定:setlocal hlsearch。)

想象這串:

foo foobar 

現在,/foo將突出在兩個單詞foo。但有時您只想匹配foobar中的foo。那麼你必須使用/foobar\&foo

反正就是這樣。是否經常使用?到目前爲止,我還沒有看到它。在這種簡單的情況下,大多數人可能會使用零寬度的原子。例如。在這個例子中可以通過/foo\zebar完成。

實施例2:

/\c\v([^aeiou]&\a){4}

\c - 忽略大小寫

\v - 「非常神奇」( - >你沒有逃脫在這種情況下&

(){4} - 重複同樣的模式4倍

[^aeiou] - 排除這些字符

\a - 字母字符

因此,這相當令人困惑,正則表達式將匹配xxxx,XXXX,wXyZWxYz,但不匹配AAAAxxx1。簡單地說:匹配任何不包含'a','e','i','o'或'u'的4個字母字符串。

+0

非常好的解釋。 –

+0

@Sniffer注意:在任何情況下,concat都可以用零寬度正向預讀('a \&b \&c'總是'\%(a \)\ @ = \%(b \)\ @ = c ',想知道爲什麼你沒有提到這個,只有幾個關於零寬度原子的文字)。預見/後視更強大,然後連接,因此習慣使用它們是有意義的,因爲當你學習新的正則表達式引擎時,它很可能既不支持預見也不支持連續或只支持外觀 - 而不是對concats有任何支持。 – ZyX

+0

另請注意,用作零寬度的'\ zs'是一個錯誤:嘗試在緩衝區中用'foo'搜索'。\ zso',並將結果與​​'。\ @<= o'進行比較。雖然不知道'\ ze'的錯誤。 – ZyX

相關問題