2012-06-15 44 views
0

在應用程序中使用字符串連接樣式而不是字符串格式(例如「{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表達式是什麼?

這些似乎是要求:

  1. 本質上找到字符串中的每個中斷 「\ S * + \ S * \ S +(。*)」(在簡化)。
  2. 用字符串形式爲{0}的標記替換每個匹配,然後將指定的值作爲參數傳遞給方法。
  3. 必須標識並跳過具有對異常的引用的log.Debug(「message」,ex)形式的調試方法。

當然,代碼會將調用切換到DebugFormat()InfoFormat()等。

與上述正則表達式的問題是,它匹配此作爲第一匹配:

「+柱+」 SEQ CNT: 「+ sequentialCount +」

代替:

「+列+「

我不能簡單地使用([^」] )而不是(。)或([^ +] *),因爲某些值具有額外的加號或使用引號作爲方法的參數。

所以它需要某種方式來說匹配所有字符,除非匹配模式\ s + \ s「這意味着加號後面跟可選空格分隔的引號。

+2

就像一個快速不談,如果你有ReSharper的,你可以做這一個全球性的代碼清理...它會比定製的解決方案 –

+0

我有ReSharper的更容易,搜索如何做這種批量清理。但是,即使在一行中,這也不適用於resharper,因爲方法log.Debug()必須切換到log.DebugFormat()。如果您有關於如何在Resharper中執行此操作的具體說明,請提供幫助。我會給你答案的。 – Wayne

+0

你不能只是做'log.Debug全球查找/替換(''到l​​og.DebugFormat('? –

回答

1

你可以使量詞懶。例如:

"\s*\+\s*(\S.*?)\s*\+\s*"