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

问题描述 投票:1回答:1

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

我正在尝试解析的行:

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\-]+?)\]

并且eceution时间下降到~9秒。

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

提前谢谢,戴夫。

c# regex query-performance
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.