微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#Regex性能非常慢

我是正则表达式主题的新手.我想用以下正则表达式解析日志文件
(?<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);

原文地址:https://www.jb51.cc/c/111336.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐