2017-05-31 43 views
0

我試圖刪除前導和功能尾部的空格,但它不工作:Vim的 - 消除領先,並在功能尾隨空格

function Trim(s) 
    echo ">>>".a:s."<<<" 
    let ss = substitute(a:s, '\v^\s*([^\s]+)\s*$', '\1', '') 
    echo ">>>".ss."<<<" 
endfunction 

https://regex101.com/

更換\s*([^\s]+)\s*工程確定的正則表達式*與+沒有任何區別。

測試:

: call Trim(" testing ") 

輸出:

>>> testing <<< 
>>> testing <<< 

而且似乎如果我使用雙引號對在替代功能單引號無所謂。

問題在哪裏?如何解決?謝謝。

回答

3

你的問題是由您的收藏所致。

您應該使用[^ ]而不是[^\s]

function! Trim(s) 
    echo ">>>".a:s."<<<" 
    let ss = substitute(a:s, '\v^\s*([^ ]+)\s*$', '\1', '') 
    echo ">>>".ss."<<<" 
endfunction 

這是因爲集合在單個字符工作,\s不是個性;它被視爲\後跟s,由於s不是一個需要轉義的特殊字符,所以不能解析爲任何內容。

如果您想您的收藏中包括空格和製表符,使用此:

[^ \t] 
[ \t] 

其中\t代表一個標籤。

+0

到目前爲止,我* *評論'\ s',tx羅曼。請注意,這個集合的解釋似乎是vim特定的?!我發現使用相同的解釋唯一的正則表達式是POSIX。 –

+0

這很好地解釋了這個問題。如果用雙引號而非單引號括起來,我也會發現解決方案不起作用。什麼原因? (根據這裏的答案https://stackoverflow.com/questions/13435586/should-i-use-single-or-double-quotes-in-my-vimrc-file,我期望在這裏需要雙引號)。 – rnso

+0

實際上,在文檔http://vimdoc.sourceforge.net/htmldoc/eval.html#substitute%28%29中,正在使用雙引號。 – rnso

1

你正在包括什麼需要保留在你的搜索/替換。更容易是隻想找什麼需要TE被刪除和替代品

:%s/\v(^\s+|\s+$)//g 

擊穿

%s    Start a global search/replace 
\v    Use Very Magic 
(^\s+   search for leading spaces 
|    or 
\s+$)   search for trailing spaces 
//g   remove all search results from entire line 
+0

這是沒問題,但問題是爲什麼我的代碼不工作?該代碼有什麼問題,如何糾正? – rnso

+0

您正在使用的搜索模式'\ v^\ s *([^ \ s] +)\ s * $'不會返回任何結果。如果您堅持在搜索中包含需要保留的內容,那麼您就會變得複雜。您需要注意貪婪的搜索,沒有前導空格的行和沒有空格的行。 –

+0

'\ s *'用於0或更多的前導或尾隨空格。我需要檢查重新貪婪的搜索。 – rnso

2

正如romainl所解釋的,[^\s]既不意味着\也不意味着s\s(即除空格或製表符之外的任何內容)將是\S

否則,這裏是另一種解決方案:在LH-VIM-lib中,我定義如下

function! lh#string#trim(string) abort 
    return matchstr(a:string, '^\v\_s*\zs.{-}\ze\_s*$') 
endfunction 

關於各種引號字符之間的差異(一個或多個),看到​​這個Q/A上vi.SE:https://vi.stackexchange.com/questions/9706/what-is-the-difference-between-single-and-double-quoted-strings