应用程序中有数千次 log4net 调用是使用字符串连接的样式完成的,而不是使用像“{0} 大于 {1}”这样的字符串格式。
因此,我们编写了一个程序,该程序将使用 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 的正确正则表达式是什么?
这些似乎是要求:
- 基本上在字符串 "\s*+\s*(.*)\s+" 中找到每个中断(过度简化)。
- 将每个匹配项替换为字符串中 {0} 形式的标记,然后将指定的值作为方法的参数。
- 必须识别并跳过引用异常的 log.Debug("message",ex) 形式的调试方法。
当然,代码会将调用切换到 DebugFormat() InfoFormat() 等等。
上述正则表达式的问题在于它将此匹配为第一个匹配项:
" + column + " Seq Cnt: " + sequenceCount + "
代替:
“+列+”
我不能简单地使用 ([^"] ) 代替 (. ) 或 ([^+]*) 因为某些值有额外的加号或使用引号作为方法的参数。
所以它需要某种方式来表示匹配所有字符,除非匹配模式 \s+\s" ,这意味着加号后跟由可选空格分隔的引号。