0

应用程序中有数千次 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 的正确正则表达式是什么?

这些似乎是要求:

  1. 基本上在字符串 "\s*+\s*(.*)\s+" 中找到每个中断(过度简化)。
  2. 将每个匹配项替换为字符串中 {0} 形式的标记,然后将指定的值作为方法的参数。
  3. 必须识别并跳过引用异常的 log.Debug("message",ex) 形式的调试方法。

当然,代码会将调用切换到 DebugFormat() InfoFormat() 等等。

上述正则表达式的问题在于它将此匹配为第一个匹配项:

" + column + " Seq Cnt: " + sequenceCount + "

代替:

“+列+”

我不能简单地使用 ([^"] ) 代替 (. ) 或 ([^+]*) 因为某些值有额外的加号或使用引号作为方法的参数。

所以它需要某种方式来表示匹配所有字符,除非匹配模式 \s+\s" ,这意味着加号后跟由可选空格分隔的引号。

4

1 回答 1

1

您可以使量词变得懒惰。例如:

"\s*\+\s*(\S.*?)\s*\+\s*"
于 2012-06-15T14:58:53.070 回答