2017-05-31 46 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