首页 > 解决方案 > 正则表达式在 VIM 中使用正则表达式交换两个文本

问题描述

不是正则表达式专家。但是,在网上搜索了一下之后,我想出了这个表达式来交换文件中的两个文本:

%s/(\s*\(&\)\(.*\), \(.*\)\s*);/( \3, \2 );/gc

我的初始文本:

read( &regVal.mAllBits, getAddr()+offset );

我想把它换成:

read( getAddr()+offset, regVal.mAllBits );

正如您在上面看到的,要求是:

我在开头和结尾都有 \s* 以忽略空白。但是,它的问题是,语句中右括号之前的空格被添加到匹配 3。因此我得到的结果为:

read( getAddr()+offset , regVal.mAllBits );

请注意 ',' 之前的额外空格。我尝试了很多东西,但无法解决它。谁能帮我忽略正则表达式语句中模式匹配中的空格?

标签: regexvimswap

解决方案


如果您不想匹配空格,则必须使用\Snot .,因为.将匹配任何字符,包括空格。正则表达式默认总是贪婪的,所以会尽可能匹配。

%s/(\s*\(&\)\(.*\), \(\S*\)\s*);/( \3, \2 );/gc

推荐阅读