在Windows上使用Vim 7.4,我试图从C文件中的代码中删除括号前后不必要的空格;例如:
copyFunc ( copyLength, sizeof ( type ) );
以下模式删除右括号前的空格:
:%s/\(\S\) )/\1)/g
我很惊讶地发现上面的模式删除了紧跟在上面一行type
之后的第一个空格,但在最后两个连续的右括号) )
之间跳过了下一个空格这条线。
copyFunc ( copyLength, sizeof ( type) );
^
Not removed on first pass
请注意,我不是在寻找解决方法。相反,我有兴趣了解这种正则表达式行为的原因。
答案 0 :(得分:3)
为了避免无休止的递归(并且因为它通常是有意义的),:substitute
的{{1}}标记仅考虑文本尚未匹配以进行一行文本的进一步迭代
您的模式/g
中的文字)
与右括号相匹配;因此,在进一步的迭代中它不能再次匹配(这次是\(\S\) )
)。
解决此问题的一种方法是在结束括号之前结束匹配。这可以通过正面预测来完成,或者通过结束与\S
的匹配来更容易(在Vim中):
\ze