2012-09-04 46 views
3

我使用vim做搜索,並使用此命令替換字符類匹配的空間:Vim的正則表達式不

%s/lambda\s*{\([\n\s\S]\)*//gc

我試圖以匹配所有文字,底線和空白字符之後{。舉例來說,此行的全部應符合:

lambda { 
    FactoryGirl.create ... 

相反,它只匹配到新行和FactoryGirl之前沒有空格。我已經嘗試手動替換之前的所有空間,以防萬一有選項卡字符,而不是骰子。任何人都可以解釋爲什麼這不起作用?

回答

11

\s是空白的原子; \n,儘管看起來相似,但句法上是換行符的轉義序列。裏面收集原子[...],你不能包含其他原子,只有字符(包括一些特殊的像\n:help /[]

  • 當「L」標誌不 包含在'下面的轉換被接受cpoptions'裏{Vi無此功能}:
\e <Esc> 
\t <Tab> 
\r <CR> (NOT end-of-line!) 
\b <BS> 
\n line break, see above |/[\n]| 
\d123 decimal number of character 
\o40 octal number of character up to 0377 
\x20 hexadecimal number of character up to 0xff 
\u20AC hex. number of multibyte character up to 0xffff 
\U1234 hex. number of multibyte character up to 0xffffffff 

注:其它反斜槓上面提到的代碼在 []內不起作用!

所以,要麼指定空白字符字面[ \t\n...],使用相應的字符類表達[[:space:]...],或通過邏輯或\%(\s\|[...]\)結合與收集的原子。

+0

謝謝你的詳細解釋。我不知道爲什麼我以前不接受,但這徹底解決了這個問題和許多相關的問題。 –

+0

這有助於我找出爲什麼VIM不匹配空格時,我把'\ s'放在括號中。 +1 – Zelphir

1

Vim不同地解釋[ ... ]字符類中的字符。這不是字面上的,因爲該正則表達式不會完全匹配lambda {ssslambda {\\\。什麼\s\S被解釋爲...我仍然無法解釋。

但是,我能夠實現接近我想要的東西有:

%s/lambda\s*{\([\n a-zA-z]\)*//gc 

忽略標點符號,這是我想要的。這工作,但危險:

%s/lambda\s*{\([\n a-zA-z]\|.\)*//gc 

因爲一個字符添加一個類似}的最後一個字符會導致Vim在通配掛後。所以我的解決方案是將我需要的標點符號添加到角色類中。