今天在工作中遇到了點替換的麻煩事,由於數據類進行了變動,具體情況是這樣的,需要將下面的代碼:
player.skillData[i].name
替換為:
player.skillData.getSkillInfo(i).name
具體來說就是將[i]改為getSkillInfo(i),不過遇到的問題是,需要修改的數量太多,200+個使用到的地方,而且括號中還不一定是“i”,可能是各種各樣的形式(比如“index”、“_myIndex”等),總不能手動的一個一個改吧。。。
最后發現Eclipse是支持使用正則表達式的,所以只需要打開查找/替換窗口,勾上“正則表達式”,在查找文本框中填入:
(skillData\[)([a-zA-Z0-9_$]*)(\])
在替換為文本框中填入:
skillData.getSkillInfo($2)
好了,全部替換,當前文件下的所有文本都會被替換為我們需要的文本了。
最后重點說一下正則表達式的分組:
正則表達式會將匹配到的文本存儲在“$”數組中,我們可以使用$0、$1、$2...訪問到匹配成功的所有字符串,在表達式中,一個小括號即表示一個分組。
以我們的上面的表達式為例看一個示例,比如下面的文本:
var name:String = player.skillData[i].name;
經過匹配后的結果如下:
$0: skillData[i] $1: skillData[ $2: i $3: ]
我們發現,$0始終是匹配到的整個文本,而$1、$2和$3分別對應我們表達式中的3個小括號。
所以在替換時編寫$2即表示這里使用匹配出的第二個小括號中的字符即“i”。
記錄下我在解決工作中的大量上述修改的方法:
用Java或C#等語言編寫一個工具來使用正則表達式替換指定格式的文本並不難,但是我不能直接一個表達式進行套用,這樣可能會修改到正確的文本導致報錯,所以相比替換更麻煩的是定位的問題。
1.如何精確定位?
我們使用的是Eclipse,在修改源碼后問題窗口會提示報錯的行,我們可以把這些數據復制出來,這些數據中可以取出報錯的文件路徑和行數,我們只處理報錯的行,而不處理正確的行即可。
如果同一行有多個報錯,我們會得到重復的兩個信息,需要去掉多余的信息。
2.如何精確修改?
即使精確到行也可能會出現匹配錯誤的情況,比如“a.b”和“c.d”,我們可能只處理“a.b”,如果采用通用的正則就會修改兩個,所以我們需要把關鍵字a直接加到正則中,就可以實現精確替換了。