Vim - 删除函数中的前导和尾随空格

时间:2017-05-31 04:23:10

标签: regex vim replace

我正在尝试删除函数中的前导和尾随空格但它不起作用:

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

正则表达式\s*([^\s]+)\s*https://regex101.com/

上正常工作

用+替换*没有任何区别。

测试:

: call Trim("   testing    ")

输出:

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

如果我在替代函数中使用双引号与单引号似乎也很重要。

问题在哪里以及如何解决?感谢。

3 个答案:

答案 0 :(得分: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代表标签。

答案 1 :(得分: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

关于各种引号字符之间的差异,请参阅vi.SE上的此问答:https://vi.stackexchange.com/questions/9706/what-is-the-difference-between-single-and-double-quoted-strings

答案 2 :(得分:1)

您要在搜索/替换中包含需要保留的内容。更容易的是寻找需要删除的内容并替换

:%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