C# |正则表达式 |如何提高我的正则表达式性能

C# | Regex | How to improve my regex performance

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

我要解析的行:

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

我要获取什么信息:

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

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

执行大约需要 30-35 秒。

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

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

执行时间下降到约 9 秒。

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

提前致谢, 戴夫

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

对于线程 ID:

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

获取第 1 组。

来电号码:

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

获取第 1 组。

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

如果您只受困于 1 个正则表达式,您可以尝试使最后一个 + 变得贪婪:

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

这将步骤从 269 减少到 199。