我有一个日志文件,我想用正则表达式解析这些日志-如果满足正则表达式条件,这是一对一的行比较。
我要解析的行:
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秒。
能否请您看看我的正则表达式,并告诉我是否有可能改进正则表达式以获得更好的执行时间?
预先感谢, 戴夫。
答案 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。