我是正则表达式主题的新手。我想用以下正则表达式解析日志文件:
(?<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.) 使用 Wiktor Stribiż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);
关于C# Regex 性能非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39470506/