關於在Eclipse中使用正則表達式替換的一點記錄(使用正則表達式的分組)


今天在工作中遇到了點替換的麻煩事,由於數據類進行了變動,具體情況是這樣的,需要將下面的代碼:

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直接加到正則中,就可以實現精確替換了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM