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

Posted

技术标签:

【中文标题】C# |正则表达式 |如何提高我的正则表达式性能【英文标题】:C# | Regex | How to improve my regex performance 【发布时间】:2019-04-09 10:23:25 【问题描述】:

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

我要解析的行:

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>\d2).*\|Beg.*\[CallId=(?<CallId>[a-zA-Z0-9\-]+?)\]

执行大约需要 30-35 秒。

我使用的第二个正则表达式看起来像:

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

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

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

提前致谢, 戴夫。

【问题讨论】:

只是猜测,但使用 string.split 可能会更快。如果列的索引是固定的,这也会有所帮助。 是否可以使用 2 个正则表达式? @Sweeper 你是什么意思? 尝试使用字符类来允许您想要匹配的字符,而不是像 .* 这样的 (?&lt;thread&gt;\d2)[0-9| .]*\|Beg[ :/a-zA-Z|]*\[CallId=(?&lt;CallId&gt;[a-zA-Z0-9\-]+)\] Demo 并可能添加一个锚点 ^ 来断言字符串的开头。 @MightyBadaboom 在 |Beg| 之后- 每行都有不同的消息值 【参考方案1】:

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

对于线程ID:

(\d2)[^|]*\|Beg

获取第 1 组。

对于呼叫 ID:

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

获取第 1 组。

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

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

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

这将步骤从 269 减少到 199。

【讨论】:

这个带有 2 个正则表达式的解决方案非常好。现在的执行时间是 2.55s

以上是关于C# |正则表达式 |如何提高我的正则表达式性能的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式性能下降

C#文本框的文本,正则表达式约束,正整数和小数点后只有一位小数

mongodb 正则表达式查询性能问题

C#正则表达式性能纯相对JS

C#常用正则表达式符号大全

如何优化正则表达式性能?