正则表达式在线工作,但没有在Vim工作

时间:2017-05-21 03:59:57

标签: regex vim

我正在尝试将引用的术语之间的多个空格替换为单个空格,即来自:

Test line "one"            "two"            "three".

到:

Test line "one" "two" "three".

我试过了:

:%s/"[ ]+"/" "/g
:%s/"[\space]+"/" "/g

虽然高于在线正则表达式测试器(https://regex101.com/)的工作,但它们在gvim中不起作用。问题在哪里以及如何纠正?感谢。

3 个答案:

答案 0 :(得分:1)

这应该有效:

:%s/\v\s+/ /g

\v是“非常神奇”的模式。我将其包含在内以保持一致性,否则表达式的行为会有所不同,具体取决于magic的设置。

\s+将匹配任何连续的空白块。替换是一个单一的空间。最终结果是将任何连续的空白块折叠到单个空间。

注意:如果设置了gdefault,则上述操作无效(因为在这种情况下,g标志会禁用正常行为)。因此,如果您设置了gdefault,请不要使用g

关于“非常神奇”

由于它出现在评论中,我将详细阐述一下。 Vim有“魔法”或“无害”模式的概念。如果您愿意,可以在:help 'magic中阅读更多相关信息,我不想在这里写一篇关于该主题的长篇文章。

简短版本取决于设置,事情表现不同。因此,使用特定模式通常很有帮助,特别是在stackoverflow等未来读者会出现的地方,你不知道他们的设置是什么。

因此使用特定模式是有益的IMO。这是“非常神奇”模式的定义:

  

\v的使用意味着在所有ASCII字符之后的模式中除外   0 - 9a - zA - Z_具有特殊含义。 “非常神奇”

这是(IMO)真正可预测的 - 很容易记住哪些字符默认具有特殊含义,哪些不具有特殊含义。它也更加干净地与人们习惯使用许多编程语言的正则表达式排列在一起。例如:

  • \s - 使用反斜杠,因为它是字母数字
  • +* - 不需要反斜杠,不需要字母数字
  • ( )(分组)或[ ](字符类) - 不需要反斜杠,这些不是字母数字

熟悉正则表达式的人更有可能尝试\s+而不是\s\+。或者他们会尝试[0-9]*而不是\[0-9\]\*。所以非常神奇的模式对我来说似乎更直接。

答案 1 :(得分:1)

我发现'+'被视为文字字符。它应该是'\+'。现在以下两个版本都有效:

%s/ \+/ /g
%s/\s\+/ /g

答案 2 :(得分:1)

这会将引用的字词与单个空格之间的多个空格替换为

:%s/" \+"/" "/g

<强>之前

Test line "one"            "two"            "three".
Alpha     "Preserve    internal   spacing"       "alpha    beta" "blow   fish"
This    line has no  quotes

<强>后

Test line "one" "two" "three".
Alpha     "Preserve    internal   spacing" "alpha    beta" "blow   fish"
This    line has no  quotes

如果要替换制表符和空格,请使用:%s/"\s\+"/" "/g