我在正则表达式方面非常新手。我想使用以下正则表达式解析日志文件:
(?<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
一个大约有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
String.Split
来获取列数组。 - kiziuString.Split()
。否则,请将所有的.*?
替换为[^|]*
,同时将[|][|][|]
替换为[|]{3}
,这样可能会使代码运行更快。实际上,即使你需要检查某些特定列的值是否为数字,也可以使用非正则表达式的代码来实现。 - Wiktor Stribiżew[|]
似乎是获取一个字符的低效方式。正则表达式引擎可能会将其优化为单个显式字符,但也可能不会。我建议在整个代码中将它们替换为\|
。 - AdrianHHH