在應用程序中使用字符串連接樣式而不是字符串格式(例如「{0}大於{1}」)進行數千次調用。 。在源代碼中解析C#未格式化的字符串,然後轉換爲字符串格式
因此,我們編寫了一個程序,該程序將使用Regex解析所有.cs文件以查找log4net日誌記錄語句。它提取括號()之間的代碼,然後調用一個方法來重新格式化它並返回結果。然後它重寫源代碼文件。
此問題涉及重新格式化日誌語句的方法。
它接收字符串的參數並返回字符串。
這裏的日誌報表的一個樣本:
"Column " + column + " Seq Cnt: " + sequentialCount + ": Seq Avg: " + (sequentialTotal/sequentialCount)
"Opening file for writing copy protection failed. Retrying.", ex
"for assert " + value.ToString("X")
"ExpirationTime()"
"count = " + count + ", round << " + count + " = " + (round << count)
"Total Diff Bytes = " + (7*count)
(series.Count - i - 1) + " " + series.Time[i] + " O,H,L,C:" + series.Open[i].ToDouble() + "," +
series.High[i].ToDouble() + "," +
series.Low[i].ToDouble() + "," +
series.Close[i].ToDouble()
"Recovered orders from snapshot: \n" + OrderStore.OrdersToString()
從本質上講,它似乎是計劃應該是使用Regex.Replace()與MatchEvaluator。
Regex.Replace的正確Regex表達式是什麼?
這些似乎是要求:
- 本質上找到字符串中的每個中斷 「\ S * + \ S * \ S +(。*)」(在簡化)。
- 用字符串形式爲{0}的標記替換每個匹配,然後將指定的值作爲參數傳遞給方法。
- 必須標識並跳過具有對異常的引用的log.Debug(「message」,ex)形式的調試方法。
當然,代碼會將調用切換到DebugFormat()InfoFormat()等。
與上述正則表達式的問題是,它匹配此作爲第一匹配:
「+柱+」 SEQ CNT: 「+ sequentialCount +」
代替:
「+列+「
我不能簡單地使用([^」] )而不是(。)或([^ +] *),因爲某些值具有額外的加號或使用引號作爲方法的參數。
所以它需要某種方式來說匹配所有字符,除非匹配模式\ s + \ s「這意味着加號後面跟可選空格分隔的引號。
就像一個快速不談,如果你有ReSharper的,你可以做這一個全球性的代碼清理...它會比定製的解決方案 –
我有ReSharper的更容易,搜索如何做這種批量清理。但是,即使在一行中,這也不適用於resharper,因爲方法log.Debug()必須切換到log.DebugFormat()。如果您有關於如何在Resharper中執行此操作的具體說明,請提供幫助。我會給你答案的。 – Wayne
你不能只是做'log.Debug全球查找/替換(''到log.DebugFormat('? –