C#|正则表达式|如何提高我的正则表达式效果

时间:2019-04-09 10:23:26

标签: c# regex query-performance

我有一个日志文件,我想用正则表达式解析这些日志-如果满足正则表达式条件,这是一对一的行比较。

我要解析的行:

190326 000117.252|0|0|1221564|21|Beg|Request: http://myurl/services/serviceName [CallId=85aa2407-8ca0-481c-9ece-a772ca789ce0]

我想获取哪些信息:

  • threadId = 21-在| Beg |之前声明
  • callID = 85aa2407-8ca0-481c-9ece-a772ca789ce0-末尾的callId值

我创建的第一个正则表达式如下:

(?<thread>\d{2}).*\|Beg.*\[CallId=(?<CallId>[a-zA-Z0-9\-]+?)\]

执行时间约为30-35秒。

我使用的第二个正则表达式如下:

(?<thread>\d{2})[^|]*\|Beg.*\[CallId=(?<CallId>[a-zA-Z0-9\-]+?)\]

安装时间降至约9秒。

能否请您看看我的正则表达式,并告诉我是否有可能改进正则表达式以获得更好的执行时间?

预先感谢, 戴夫。

1 个答案:

答案 0 :(得分:1)

如果可以使用两个正则表达式,请使用两个正则表达式-一个用于线程ID,另一个用于调用ID。

对于线程ID:

(\d{2})[^|]*\|Beg

获取组1。

通话ID:

CallId=([a-zA-Z0-9\-]+)

获取组1。

在regex101.com上,您的正则表达式执行了269个步骤,而这两个正则表达式分别执行了141和11个步骤。

如果仅使用1个正则表达式,则可以尝试使最后一个+贪心:

(?<thread>\d{2})[^|]*\|Beg.*\[CallId=(?<CallId>[a-zA-Z0-9\-]+)\]

这将步骤从269减少到199。