在寫程式時,如果一開始沒有考慮到可移植性,把字串都寫成了:
"hello,world!"
到了後面,想把大量的這裡字串替換成:
_T"hello,world!"
這該如何是好呢,作為一個合格的程式員,請不要一個個的改,不然會被人鄙視的...
而在vs中,提供了簡單解決這玩意的方法,事實上也不簡單,我查了一個小時才學會的。
關鍵就是Regex,關於Regex,以下有一篇很好的Regex入門:
http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm
注意:這個教程中的Regex和vs中有不少差別,主要是元字元等等。
瞭解了Regex後,開啟vs的尋找替換,點開尋找選項->使用,在combobox中選Regex,好了,這樣就可以使用Regex了。
在尋找框中輸入:{"[^"]*"}
在替換框中輸入:_T/1
我們的任務就結束了,如果你看了上面那篇文章,那麼說明一下,在vs中,{}代表分段,而不是()。
另外一個例子:
將使用wxWidgets的程式移植到mfc時,經常會遇到這樣的運算式:
wx_static(void*, ptr);
其實就相當於(void*)ptr。
在尋找框中輸入: wx_static_cast{/(.*},{.*}/)
替換框中輸入: /1/)/2
其實,更清晰的方式應該是這樣的:
在尋找框中輸入: wx_static_cast/({.*},{.*}/)
替換框中輸入: /(/1/)/2
但是很奇怪的,vs無法替換成以/(開頭的標識。
顯然()需要用轉義輸入,而.*代表了任一字元串。
然而,上面的代碼在實踐中卻是不可行的!!!
看似正確的背後,隱藏著重重"胸肌"....
正確的做法應該是在寫完了Regex後,進行良好的測試,再進行運用,比如,上面的例子的一個比較可用的版本是:
在尋找框中輸入: wx_static_cast{/([^,()]*},{[^(),]*}/)
替換框中輸入: /(/1/)/2
可能不是很好理解,但是他的排他性在我的實際情況中已經夠用了,很可能的是,在其他的情況下他還是不夠的,那就需要進一步的完善,所以,我的經驗是,使用Regex,應該根據實際情況來進行,不可盲目自信,也不可輕易放棄,一切從實際出發...