我正在尝试删除函数中的前导和尾随空格但它不起作用:
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 <<<
如果我在替代函数中使用双引号与单引号似乎也很重要。
问题在哪里以及如何解决?感谢。
答案 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