Vim中的Regex在第一次传球中错失了两场比赛中的第二名,需要第二次传球

时间:2017-11-23 13:30:20

标签: regex vim

在Windows上使用Vim 7.4,我试图从C文件中的代码中删除括号前后不必要的空格;例如:

copyFunc ( copyLength, sizeof ( type ) );

以下模式删除右括号前的空格:

:%s/\(\S\) )/\1)/g

我很惊讶地发现上面的模式删除了紧跟在上面一行type之后的第一个空格,但在最后两个连续的右括号) )之间跳过了下一个空格这条线。

copyFunc ( copyLength, sizeof ( type) );
                                     ^
                                     Not removed on first pass

请注意,我不是在寻找解决方法。相反,我有兴趣了解这种正则表达式行为的原因。

1 个答案:

答案 0 :(得分:3)

为了避免无休止的递归(并且因为它通常是有意义的),:substitute的{​​{1}}标记仅考虑文本尚未匹配以进行一行文本的进一步迭代

您的模式/g中的文字)与右括号相匹配;因此,在进一步的迭代中它不能再次匹配(这次是\(\S\) ))。

解决此问题的一种方法是在结束括号之前结束匹配。这可以通过正面预测来完成,或者通过结束与\S的匹配来更容易(在Vim中):

\ze