我是正则表达式主题的新手.我想用以下正则表达式解析日志文件:
(?<time>(.*?))[|](?<placeholder4>(.*?))[|](?<source>(.*?))[|](?<level>[1-3])[|](?<message>(.*?))[|][|][|](?<placeholder1>(.*?))[|][|](?<placeholder2>(.*?))[|](?<placeholder3>(.*))
日志行如下所示:
2001.07.13 09:40:20|1|SomeSection|3|====== Some log message::Type: test=sdfsdf|||.\SomeFile.cpp||60|-1
带appr的日志文件3000行需要很长时间才能解析它.你有一些提示来加速表现吗?谢谢…
更新:
我使用正则表达式,因为我使用不同的日志文件,不具有相同的结构,我使用它:
string[] fileContent = File.ReadAllLines(filePath); Regex pattern = new Regex(LogFormat.GetLineRegex(logFileFormat)); foreach (var line in fileContent) { // Split log line Match match = pattern.Match(line); string logDate = match.Groups["time"].Value.Trim(); string logLevel = match.Groups["level"].Value.Trim(); // And so on... }
解:
谢谢你的帮助.我用以下结果测试了它:
1.)只添加了RegexOptions.Compiled:
从00:01:10.9611143到00:00:38.8928387
2.)使用Thomas Ayoub正则表达式
从00:00:38.8928387至00:00:06.3839097
3.)使用了WiktorStribiżew正则表达式
从00:00:06.3839097至00:00:03.2150095
非常感谢你的帮助!!!
解决方法
让我将我的评论“转换”成答案,因为现在我看到你可以对正则表达式的表现做些什么.
As I have mentioned above,全部替换.*?使用[^ |] *,以及所有重复[|] [|] [|]和[|] {3}(或类似的,取决于[|]的数量.另外,不要使用嵌套的捕获组,也会影响性能!
var logFileFormat = @"(?<time>[^|]*)[|](?<placeholder4>[^|]*)[|](?<source>[^|]*)[|](?<level>[1-3])[|](?<message>[^|]*)[|]{3}(?<placeholder1>[^|]*)[|]{2}(?<placeholder2>[^|]*)[|](?<placeholder3>.*)";
只有最后一个.*可以保持“狂野的”,因为它将抓住剩余的线.
以下是您和我的正则表达式模式在RegexHero的比较.
然后,使用RegexOptions.Compiled:
Regex pattern = new Regex(LogFormat.GetLineRegex(logFileFormat),RegexOptions.Compiled);