在源代码中解析C#未格式化的字符串,然后转换为字符串格式

时间:2012-06-15 14:49:46

标签: c# .net regex

在应用程序中有数千个对log4net的调用,这些调用是使用字符串连接样式完成的,而不是使用字符串格式,如“{0}大于{1}”。

因此,我们编写了一个程序,它将使用Regex解析所有.cs文件,以查找log4net日志记录语句。它提取括号()之间的代码,然后调用方法重新格式化它并返回结果。然后它重写源代码文件。

此问题与重新格式化日志语句的方法有关。

它接收一个string参数并返回string。

以下是日志语句的示例:

"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)的调试方法,它们具有对异常的引用。
  4. 当然,代码会将调用切换到DebugFormat()InfoFormat()等等。

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

    “+ column +”Seq Cnt:“+ sequentialCount +”

    而不是:

    “+ column +”

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

    因此需要某种方式来匹配所有字符,除非匹配模式\ s + \ s“这意味着加号后面跟一个由可选空格分隔的引号。

1 个答案:

答案 0 :(得分:1)

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

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