在写程序时,如果一开始没有考虑到可移植性,把字符串都写成了:
"hello,world!"
到了后面,想把大量的这里字符串替换成:
_T"hello,world!"
这该如何是好呢,作为一个合格的程序员,请不要一个个的改,不然会被人鄙视的...
而在vs中,提供了简单解决这玩意的方法,事实上也不简单,我查了一个小时才学会的。
关键就是正则表达式,关于正则表达式,以下有一篇很好的正则表达式入门:
http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
注意:这个教程中的正则表达式和vs中有不少差别,主要是元字符等等。
了解了正则表达式后,打开vs的查找替换,点开查找选项->使用,在combobox中选正则表达式,好了,这样就可以使用正则表达式了。
在查找框中输入:{"[^"]*"}
在替换框中输入:_T/1
我们的任务就结束了,如果你看了上面那篇文章,那么说明一下,在vs中,{}代表分段,而不是()。
另外一个例子:
将使用wxWidgets的程序移植到mfc时,经常会遇到这样的表达式:
wx_static(void*, ptr);
其实就相当于(void*)ptr。
在查找框中输入: wx_static_cast{/(.*},{.*}/)
替换框中输入: /1/)/2
其实,更清晰的方式应该是这样的:
在查找框中输入: wx_static_cast/({.*},{.*}/)
替换框中输入: /(/1/)/2
但是很奇怪的,vs无法替换成以/(开头的标识。
显然()需要用转义输入,而.*代表了任意字符串。
然而,上面的代码在实践中却是不可行的!!!
看似正确的背后,隐藏着重重"胸肌"....
正确的做法应该是在写完了正则表达式后,进行良好的测试,再进行运用,比如,上面的例子的一个比较可用的版本是:
在查找框中输入: wx_static_cast{/([^,()]*},{[^(),]*}/)
替换框中输入: /(/1/)/2
可能不是很好理解,但是他的排他性在我的实际情况中已经够用了,很可能的是,在其他的情况下他还是不够的,那就需要进一步的完善,所以,我的经验是,使用正则表达式,应该根据实际情况来进行,不可盲目自信,也不可轻易放弃,一切从实际出发...