Regex 正则表达式在线工作,但不在Vim中工作

Regex 正则表达式在线工作,但不在Vim中工作,regex,vim,Regex,Vim,我试图将引用术语之间的多个空格替换为单个空格,即从: Test line "one" "two" "three". 致: 我试过: :%s/"[ ]+"/" "/g :%s/"[\space]+"/" "/g 虽然上面的代码在online regex tester()中有效,但在gvim中不起作用。问题在哪里?如何纠正?谢谢。这应该可以: :%s/\v\s+//g \v是“非常神奇”的模式。为了保持一致性,我将其包括在内,否则表达式的行为将根据您

我试图将引用术语之间的多个空格替换为单个空格,即从:

Test line "one"            "two"            "three".
致:

我试过:

:%s/"[ ]+"/" "/g
:%s/"[\space]+"/" "/g
虽然上面的代码在online regex tester()中有效,但在gvim中不起作用。问题在哪里?如何纠正?谢谢。

这应该可以:

:%s/\v\s+//g
\v
是“非常神奇”的模式。为了保持一致性,我将其包括在内,否则表达式的行为将根据您对
magic
的设置而有所不同

\s+
将匹配任何连续的空白块。替换为单个空间。最终的结果是将任何连续的空白块压缩为单个空间

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

关于“非常神奇” 因为它是在评论中提出来的,所以我将对此进行详细阐述。Vim有“魔法”或“游牧”模式的概念。您可以在
:help'magic
中了解更多信息,如果您愿意,我不想在这里就这个主题写一篇长文章

简短的版本是,根据设置的不同,事情表现不同。因此,使用特定模式通常很有帮助,特别是在stackoverflow这样的地方,未来的读者会出现在这里,而您不知道他们的设置可能是什么

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

使用
\v
意味着在其后面的模式中,除了
0
-
9
a
-
z
a
-
z
具有特殊含义。“非常神奇”

这(依我看)确实是可以预测的——很容易记住默认情况下哪些字符可以有特殊含义,哪些字符没有。它还更清晰地与人们习惯于使用多种编程语言的正则表达式对齐。例如:

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

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

我发现
'+'
被视为一个文字字符。它应该是
'\+'
。现在,以下两个版本都可以工作:

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

这将引用术语之间的多个空格替换为单个空格

:%s/" \+"/" "/g
Test line "one"            "two"            "three".
Alpha     "Preserve    internal   spacing"       "alpha    beta" "blow   fish"
This    line has no  quotes
之前

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

尝试使用
\s+
替换为
/
,我仍然得到“找不到模式”。实际上,在我的例子中,它在结尾处与“g”一起工作,没有它就无法工作。你认为这是为什么?我如何在我的案例中找到神奇的设置?我应该保持什么设置?@mso那是因为我忘了我有
gdefault
活动。我更正了我的答案。您可以使用
:set magic?
查看
magic
的设置,但如果在表达式中使用
\v
,则设置无关紧要<代码>\v仍将覆盖该设置。这就是为什么我把它放在那里,这样你就不必关心它设置为什么。FWIW,
+
是否需要
\
取决于
magic
的当前设置。(这就是为什么我使用了
\v
,因此
magic
的设置不是一个变量。)似乎我应该在vim中始终使用\v。是这样吗?@mso我更新了我的答案,补充了一些关于非常神奇模式的信息,以回答你的评论。