要實現一個功能:lua
從 lua 文件中提取字符串放到 excel 中,再將 excel 給海外同事,翻譯完成後,用翻譯的文本替換相應中文。翻譯
整個功能並不複雜,要點有二點:excel
一、提取字符串,一行中文如「我是中文…」,中間可能會遇到」我是中文\」xx\」我是中文」,若是用正則\」[^\」]+\」則會匹配失敗,思路就是先將\」替換,查找成功後再將其替換回來,excel中有三列,分別是:key、中文、待翻譯文本。對象
二、替換 lua 文件中的中文,先將 excel 讀出來放到 Dictionary<string, string[]>對象中,而後逐行讀取 lua 文件,拿到 key、中文,再從 Dictionary 中查找,知足條件後則進行替換。blog
以繁體爲例文檔
爲了防止出現:新增了一個 key,或者某個 key 對應的中文有修改,因此在替換的時候有嚴格的檢查。必須該行的 key、value,都存在於 excel 中,才替換相應的內容(僅一次)。字符串
str9999="我是中文"--[["我是中文"]]string
用string.Replace操做時,上面「我是中文」所有都被替換,不是所指望的。假設韓文或者越南文,咱們確定但願知道這個字符串所表示的含義,故特意將中文保留下來。new Regex().Replace 方法處理字符串嵌套比較麻煩,最後改成 string.Remove().Insert() 來處理。it
講到這裏,基本都是在講該功能的一些實現細節。在替換我提交SVN的時候,我就發現,明明該lua文件有3405行,但只顯示3404行,最後一行是換行符,被幹掉了。而後我查代碼,發現沒問題,被狗吃了?io
若是最後一行改成字符串,如a,行數顯示正常。
若是我額外加5行,顯示結果是3409,說明加的5行都識別了,並無對我添加的換行有特殊處理。
但最後一行換行就是不被讀取。因此,我懷疑ReadLine方法壓根就沒讀最後一行。查了一下官方文檔,找到了答案:
將行定義爲後面的字符後跟一條線序列︰ 換行符 ("\n")、 回車符 ("\r") 或回車符後跟一條線換行符 ("\r\n")。 返回的字符串不包含終止回車或換行。 返回的值是 null 若是到達了輸入流的末尾。
所謂「終止」回車或換行,指的就是上面遇到的,文件最後一行是若是是換行\回車,它不會讀取最後一行。
若是使用ReadLine對文件進行行數統計,須要注意最後一個終止回車/換行並不會被讀取,否則獲得的行數永遠會少1