我想动态地从日志文件中选择"摘要"之前的所有文本。直到我发现错误。在这一刻,a只成功获取了这个字符串:
(Total Scanned Files = 0)(Start Time = 2/16/2021 8:42:55 AM)(End Time = 2/16/2021 8:43:24 AM)(Total Time = 0h 0m 29s)}
但是我想用最后一个"总结"。在那里我发现了"错误"。所以我最终选中的字符串是这样的
(Command ScanPath = \D-022-an-labsdmsData)(Total Scanned Files = 0)(Total Archived Files = 20)(Total Bytes = 2707931)(Start Time = 2/16/2021 8:43:24 AM)(End Time = 2/16/2021 8:44:20 AM)(Total Time = 0h 0m 55s)(Errors = 0)
我的正则表达式:
bMessage[^:]+:s(?<LogEntryDate>[d-]+s[d:]+):s(?:Beginning|<-sclsAAProxy)(?:[^{]+(?:{(?!Summarys:s(?=(Total))[^{]+)+){Summarys:s(?:(?<Summary>(?<keyval>((?<key>[^=]+)s=s(?<value>[^)]+)))+)})(?>[^N]+(?:N(?!ext)[^N]+)*)bNextbs[^d]+(?<ReqNumber>d+)siss(?<NextRunDate>[d-]+s[d:]+)
我也把我的日志文件放入regex101: https://regex101.com/r/WwKLCx/1/
可以使用
bMessage[^:]+:s(?<LogEntryDate>[d-]+s[d:]+):s(?:Beginning|<-sclsAAProxy)[^{]*(?:{(?!Summarys:s(Total[^{}]*(Errors = d+)})[^{]*)*?{Summarys:s(?=[^{}]*(Errors = d+)})(?:(?<Summary>(?<keyval>((?<key>[^=]+)s=s(?<value>[^)]+)))+)})[^N]+(?:N(?!ext)[^N]+)*bNextbsD*(?<ReqNumber>d+)s+iss+(?<NextRunDate>[d-]+s[d:]+)
查看regex演示
我在负向前看中添加了[^{}]*(Errors = d+)})
,以精确地获得包含" error "的{Summary
,并在随后的模式部分中添加了(?=[^{}]*(Errors = d+)})
,以确保捕获的Summary
实际上包含此子字符串。