VS使用正则表达式实现批量修改代码
背景
在重构代码的过程中,可能会存在新增或者删减函数参数的行为。对于老项目,一个函数有时候会超过几百个调用,这个时候如果一个一个去修改对应的调用方代码,那么无疑会是开销巨大的体力劳动。
本篇文章将介绍VS的正则表达式,通过正则表达式搜索和替换,我们可以批量修改函数的调用方,以此来提高开发效率。
正文
面对的问题
比如我们有下面这两个函数,我们准备将调用老函数的代码,改为调用新函数。
//新函数
public Port CreatePort( string name, PortTypeEnum conType, ValueTypeEnum valueType)
{
return CreatePort( name, conType, valueType, false);
}
//老函数
public Port CreatePort( string name, PortTypeEnum conType, ValueTypeEnum valueType, bool outerLabel)
{
return new Port().Initialize(this, name, conType, valueType, outerLabel);
}
接着展示一下 调用方的代码,这里我们想要通过删除 最后一个值为false的参数,来实现将调用 老的函数 改为调用 新的函数。
//调用方 (老)
CreatePort("VFACE",PortTypeEnum.Output,ValueTypeEnum.vector1,false)
CreatePort("XYZ",PortTypeEnum.Output,ValueTypeEnum.vector3,false).SetOutputChannelMask(PortChannelEnum.RGB),
//调用方 (新)
CreatePort("VFACE",PortTypeEnum.Output,ValueTypeEnum.vector1)
CreatePort("XYZ",PortTypeEnum.Output,ValueTypeEnum.vector3).SetOutputChannelMask(PortChannelEnum.RGB),
构造正则表达式
.可以匹配任意单个字符,+?匹配一次或多次匹配前面的表达式(匹配尽可能少的字符)。 .+?就可以匹配任意个字符(尽量少)。
如果想要替换老的调用方的代码,我们可以使用
CreatePort\((.+?),(.+?),(.+?),false\) 去搜索。
CreatePort($1,$2,$3) 去替换。
这里搜索用的正则表达式里的括号()表示捕获组,具有特殊的语义,因此我们需要用\将CreatePort这个函数的括号给转义掉,避免它影响捕获组的结果。
接着在替换中用的正则表达式中,我们就可以使用$1来引用第1个捕获组(第1个括号)里面的内容。用$2捕获第2个括号里面的内容。
我们还可以加入\s匹配符来消除空格字符 对搜索带来的影响。 CreatePort\((.+?),(.+?),(.+?),\s*?false\s*?\)

浙公网安备 33010602011771号