【发布时间】:2016-09-13 12:47:54
【问题描述】:
我是正则表达式主题的新手。我想用以下正则表达式解析日志文件:
(?<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
【问题讨论】:
-
你为什么使用正则表达式?看来您可以只使用
String.Split来获取列数组。 -
除非你真的需要选择这种类型的行(特定列中有数字),否则你真的可以使用
String.Split()。否则,将所有.*?替换为[^|]*,您还可以通过将[|][|][|]替换为[|]{3}获得更快的速度。实际上,即使您需要检查某个特定列的值是否为数字,您也可以使用非正则表达式的代码来做到这一点... -
您还没有向我们展示您实际上是如何匹配正则表达式的 - 请添加相关代码。
-
哦,是的,正则表达式对象 - 如果使用非静态方法 - 应该在循环之外创建。
-
字符类
[|]似乎是获取一个字符的低效方式。正则表达式引擎可能会将其优化为单个显式字符,但也可能不会。我会用\|替换它们。