在Windows上使用VIM 7.4,我试图从C文件中的代码中删除括号前后的不必要的空间;示例:
copyFunc ( copyLength, sizeof ( type ) );
以下模式在闭合括号之前删除了一个空间:
:%s/(S) )/1)/g
我很惊讶地发现上述模式在上面的type
之后立即删除了第一个空间,但跳过了下一个模式,在最后两个连续的闭合括号 ) )
之间。
copyFunc ( copyLength, sizeof ( type) );
^
Not removed on first pass
请注意,我不是在寻找解决方法。相反,我有兴趣了解这种正则行为的原因。
避免无尽的递归(并且因为这通常是有道理的),:substitute
的/g
flag仅考虑文本尚未匹配,以在文本线上进行进一步的迭代。
您的模式中的字面 )
(S) )
与闭合括号匹配;因此,它无法在进一步的迭代中再次匹配(这次为S
)。
解决此问题的一种方法是结束匹配 closing括号。可以通过用ze
结束匹配:
:s/(S) ze)/1/g