【发布时间】: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>\d{2}).*\|Beg.*\[CallId=(?<CallId>[a-zA-Z0-9\-]+?)\]
执行大约需要 30-35 秒。
我使用的第二个正则表达式看起来像:
(?<thread>\d{2})[^|]*\|Beg.*\[CallId=(?<CallId>[a-zA-Z0-9\-]+?)\]
并且 eceution 时间下降到 ~9 秒。
能否请您看看我的正则表达式并告诉我是否有可能改进正则表达式以获得更好的执行时间?
提前致谢, 戴夫。
【问题讨论】:
-
只是猜测,但使用 string.split 可能会更快。如果列的索引是固定的,这也会有所帮助。
-
是否可以使用 2 个正则表达式?
-
@Sweeper 你是什么意思?
-
尝试使用字符类来允许您想要匹配的字符,而不是像
.*这样的(?<thread>\d{2})[0-9| .]*\|Beg[ :/a-zA-Z|]*\[CallId=(?<CallId>[a-zA-Z0-9\-]+)\]Demo 并可能添加一个锚点^来断言字符串的开头。 -
@MightyBadaboom 在 |Beg| 之后- 每行都有不同的消息值
标签: c# regex query-performance