求正则表达式,高分相酬!

神奇的章鱼哥 2014-03-28 10:53:09
在升级一个项目,因为引用的基础类库换了,所以遇到把原先项目中代码里调用的函数都要改成新的调用方法,这个调用的地方太多了,所以需要进行查找替换,但是因为调用时使用的参数不一样,不能一次性替换,所以需要用正则表达式。

以前是SCMessage.ShowMSG([参数],0)这样的调用,现在要改成Parameters.MBC.ShowMSG([参数],MessageBoxType.Warn)

比如SCMessage.ShowMSG(“CSDN论坛",0),使用正则替换后是Parameters.MBC.ShowMSG(“CSDN论坛",MessageBoxType.Warn)

比如SCMessage.ShowMSG(SRV.Message,0),使用正则替换后是Parameters.MBC.ShowMSG(SRV.Message,MessageBoxType.Warn)

比如SCMessage.ShowMSG(Func.BuildStr("AAA",Bstr,"C"),0),使用正则替换后是Parameters.MBC.ShowMSG(Func.BuildStr("AAA",Bstr,"C"),MessageBoxType.Warn)

可以看到红色的字是不动的,就是修改函数的调用方法,求在IDE里使用查找替换怎么写这个正则表达式。
...全文
181 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
神奇的章鱼哥 2014-03-28
  • 打赏
  • 举报
回复
引用 9 楼 caozhy 的回复:
[quote=引用 8 楼 imwjb 的回复:] [quote=引用 3 楼 caozhy 的回复:] 不建议使用正则表达式,你可以利用VS的重构功能。 方法是,首先创建一个和你的原来的函数名字、签名一样,但是不包含实现的方法,我们称之为桩子。 然后对它重构,转换成新的名字,这样,VS会自动对调用重命名。 最后将最终的实现放在改名后的桩子中。
传入参数类型不一样了,能重构吗?原来是0,1,2,3,4,5现在传入的是enum类型。[/quote] 我的意思是,你应该让编译器去检查你的修改是否正确。因为遇到类型不匹配,编译器会提醒你,这样就不会遗漏和错误。[/quote] 这我知道,但是错误的地方多达6500多处,要一个个改的话太麻烦了。
threenewbee 2014-03-28
  • 打赏
  • 举报
回复
引用 8 楼 imwjb 的回复:
[quote=引用 3 楼 caozhy 的回复:] 不建议使用正则表达式,你可以利用VS的重构功能。 方法是,首先创建一个和你的原来的函数名字、签名一样,但是不包含实现的方法,我们称之为桩子。 然后对它重构,转换成新的名字,这样,VS会自动对调用重命名。 最后将最终的实现放在改名后的桩子中。
传入参数类型不一样了,能重构吗?原来是0,1,2,3,4,5现在传入的是enum类型。[/quote] 我的意思是,你应该让编译器去检查你的修改是否正确。因为遇到类型不匹配,编译器会提醒你,这样就不会遗漏和错误。
神奇的章鱼哥 2014-03-28
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
不建议使用正则表达式,你可以利用VS的重构功能。 方法是,首先创建一个和你的原来的函数名字、签名一样,但是不包含实现的方法,我们称之为桩子。 然后对它重构,转换成新的名字,这样,VS会自动对调用重命名。 最后将最终的实现放在改名后的桩子中。
传入参数类型不一样了,能重构吗?原来是0,1,2,3,4,5现在传入的是enum类型。
神奇的章鱼哥 2014-03-28
  • 打赏
  • 举报
回复
引用 5 楼 q107770540 的回复:
vs2012内测试可以使用:
serach: SCMessage.ShowMSG\((.*),0\)
replace: Parameters.MBC.ShowMSG($1,MessageBoxType.Warn)


这样对吧?
结果SCMessage.ShowMsg("未撰写消息主题!",0);被替换成
Parameters.MBC.ShowMsg($1,MessageBoxType.Warning);
神奇的章鱼哥 2014-03-28
  • 打赏
  • 举报
回复
引用 5 楼 q107770540 的回复:
vs2012内测试可以使用: serach: SCMessage.ShowMSG\((.*),0\) replace: Parameters.MBC.ShowMSG($1,MessageBoxType.Warn)
替换后参数变成$1 了,而不是原来的字符串了,求改进
q107770540 2014-03-28
  • 打赏
  • 举报
回复
vs2012内测试可以使用: serach: SCMessage.ShowMSG\((.*),0\) replace: Parameters.MBC.ShowMSG($1,MessageBoxType.Warn)
threenewbee 2014-03-28
  • 打赏
  • 举报
回复
不建议使用正则表达式,你可以利用VS的重构功能。 方法是,首先创建一个和你的原来的函数名字、签名一样,但是不包含实现的方法,我们称之为桩子。 然后对它重构,转换成新的名字,这样,VS会自动对调用重命名。 最后将最终的实现放在改名后的桩子中。
q107770540 2014-03-28
  • 打赏
  • 举报
回复
void Main()
{
	string[] ss={"SCMessage.ShowMSG(\"CSDN论坛\",0)","SCMessage.ShowMSG(SRV.Message,0)","SCMessage.ShowMSG(Func.BuildStr(\"AAA\",Bstr,\"C\"),0)"};
	var reg=new Regex(@"(?i)SCMessage.ShowMSG\((.*),0\)");
	foreach(string s in ss)
	{
	  Console.WriteLine("{0} --> {1}",s,reg.Replace(s,"Parameters.MBC.ShowMSG($1,MessageBoxType.Warn)"));
	}
	
	/*
	SCMessage.ShowMSG("CSDN论坛",0) --> Parameters.MBC.ShowMSG("CSDN论坛",MessageBoxType.Warn)
	SCMessage.ShowMSG(SRV.Message,0) --> Parameters.MBC.ShowMSG(SRV.Message,MessageBoxType.Warn)
	SCMessage.ShowMSG(Func.BuildStr("AAA",Bstr,"C"),0) --> Parameters.MBC.ShowMSG(Func.BuildStr("AAA",Bstr,"C"),MessageBoxType.Warn)
	*/
}
q107770540 2014-03-28
  • 打赏
  • 举报
回复
easy:
str=Regex.Replace(str,@"(?i)SCMessage.ShowMSG\((.*),0\)","Parameters.MBC.ShowMSG($1,MessageBoxType.Warn)");
神奇的章鱼哥 2014-03-28
  • 打赏
  • 举报
回复
引用 14 楼 q107770540 的回复:
你的IDE是VS2010?手边没有2010的环境,不过你可以这样试试: vs2010内: serach: SCMessage.ShowMSG\({.*},0\) replace: Parameters.MBC.ShowMSG(\1,MessageBoxType.Warn)
兄弟,可以,按你的方法可以替换,正则表达式真是无所不能啊,可惜我一点不会
q107770540 2014-03-28
  • 打赏
  • 举报
回复
你的IDE是VS2010?手边没有2010的环境,不过你可以这样试试: vs2010内: serach: SCMessage.ShowMSG\({.*},0\) replace: Parameters.MBC.ShowMSG(\1,MessageBoxType.Warn)
神奇的章鱼哥 2014-03-28
  • 打赏
  • 举报
回复
引用 12 楼 caozhy 的回复:
[quote=引用 10 楼 imwjb 的回复:] [quote=引用 9 楼 caozhy 的回复:] [quote=引用 8 楼 imwjb 的回复:] [quote=引用 3 楼 caozhy 的回复:] 不建议使用正则表达式,你可以利用VS的重构功能。 方法是,首先创建一个和你的原来的函数名字、签名一样,但是不包含实现的方法,我们称之为桩子。 然后对它重构,转换成新的名字,这样,VS会自动对调用重命名。 最后将最终的实现放在改名后的桩子中。
传入参数类型不一样了,能重构吗?原来是0,1,2,3,4,5现在传入的是enum类型。[/quote] 我的意思是,你应该让编译器去检查你的修改是否正确。因为遇到类型不匹配,编译器会提醒你,这样就不会遗漏和错误。[/quote] 这我知道,但是错误的地方多达6500多处,要一个个改的话太麻烦了。[/quote] 不建议你改,你应该增加一个方法,保持和原来的方法接口一样,内部转换为对新方法的调用,作为适配器。[/quote] 因为我正在对好几套软件进行统一升级,这个方法是原来的一个通用类库的,现在因为为了规范化,重新整理了新的通用类,每个项目都会重新改过,你说的方法固然可以,甚至我可以把类库的代码写在单个项目里都行,但是就不统一了,一些常规的动作要改的话,我只要改一下这个公用的类库就行了。否则每个客户那里的项目我都得重新编译了。
threenewbee 2014-03-28
  • 打赏
  • 举报
回复
引用 10 楼 imwjb 的回复:
[quote=引用 9 楼 caozhy 的回复:] [quote=引用 8 楼 imwjb 的回复:] [quote=引用 3 楼 caozhy 的回复:] 不建议使用正则表达式,你可以利用VS的重构功能。 方法是,首先创建一个和你的原来的函数名字、签名一样,但是不包含实现的方法,我们称之为桩子。 然后对它重构,转换成新的名字,这样,VS会自动对调用重命名。 最后将最终的实现放在改名后的桩子中。
传入参数类型不一样了,能重构吗?原来是0,1,2,3,4,5现在传入的是enum类型。[/quote] 我的意思是,你应该让编译器去检查你的修改是否正确。因为遇到类型不匹配,编译器会提醒你,这样就不会遗漏和错误。[/quote] 这我知道,但是错误的地方多达6500多处,要一个个改的话太麻烦了。[/quote] 不建议你改,你应该增加一个方法,保持和原来的方法接口一样,内部转换为对新方法的调用,作为适配器。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧