C# Regex 性能非常慢

标签 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.) 使用 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 上你和我的正则表达式模式的比较.

enter image description here

然后,使用 RegexOptions.Compiled:

Regex pattern = new Regex(LogFormat.GetLineRegex(logFileFormat), RegexOptions.Compiled);

关于C# Regex 性能非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39470506/

相关文章:

c# - LINQ 确定集合中对象的属性是否存在于不同的集合中

regex - 反向引用某些内容而不将其放入表达式的其余部分

regex - 如果在语句中找到单个单词,perl 正则表达式用于打印整个语句

c# - 如何遍历匿名对象列表?

regex - R ls 的倒置正则表达式模式

c# - C# .NET 中的特定正则表达式

java - RegEx 与 If 语句验证数字范围

c# - IViewLocalizer 返回错误的语言

c# - 在不知道名称的情况下获取第一列的值

c# - 将 pdfreader 转换为 pdfdocument