为什么 vim 反向引用包装内容中不包含空格?

为什么 vim 反向引用包装内容中不包含空格?

我得到了一些格式如下的代码:print 'hi' # sample comment

我曾经:%s/^\([^#]*\)\(#.*\)/\2\r \1/gc在 vim 中更改它们的格式。
通过上面的命令,我得到了以下结果:

# sample comment
    print 'hi'\s\s\s\s\s\s\s\s\s\s\s         

\s这几乎就是我想要的,除了我用来在结果中指示的不可见的额外空格。

看来\([^#]*\)vim 命令的部分没有将空格包含在其范围内。

为什么会出现这种情况,如何解决?

答案1

发生这种情况是因为您的第一个捕获组包括空格。

    ^\([^#]*\)\(#.*\)
    | --------  -------- the comment 
begin    | 
    everything upto #
    including spaces

要解决此问题,您需要将空格保留在捕获组之外,如下所示:

   ^\(.\{-}\)\s*\(#.*\)
   |  ------  --   ------ comment
begin    |     \____ any amount of whitespace
  non-greedy match

这将使你的完整命令:

%s/^\(.\{-}\)\s*\(#.*\)/\2\r    \1/gc

相关内容