c# - 有什么方法可以提高 Regex.Replace 性能吗?

标签 c# .net

我需要进行字符串替换...我只需要处理几种情况:

1) optional case insensitive
2) optional whole words

现在我正在使用 _myRegEx.Replace()...如果指定了 #1,我将添加 RegexOptions.IgnoreCase 标志。如果指定了 #2,我会将搜索词包含在\b\b 中。

这工作得很好,但它真的很慢。我的基准测试需要 1100 毫秒,而使用 String.Replace 需要 90 毫秒。显然这样做存在一些问题:

1) case insensitive is tricky
2) regex \b<word>\b will handle "<word>", " <word>", "<word> " and " <word> "... string replace would only handle " <word> ".

我已经在使用 RegexOptions.Compiled 标志。

还有其他选择吗?

最佳答案

如果您使用已编译的正则表达式,在这种情况下您可以获得显着的改进。老实说,这不是我第一次测量正则表达式的性能,并发现编译的正则表达式速度较慢,即使按照应有的方式使用也是如此。

让我们使用四种不同的方法将字符串中的 \bfast\b 替换为 12345 一百万次,并计算这在两台不同的 PC 上花费的时间:

var str = "Regex.Replace is extremely FAST for simple replacements like that";
var compiled = new Regex(@"\bfast\b", RegexOptions.IgnoreCase | RegexOptions.Compiled);
var interpreted = new Regex(@"\bfast\b", RegexOptions.IgnoreCase);
var start = DateTime.UtcNow;
for (int i = 0; i < 1000000; i++)
{
    // Comment out all but one of these:
    str.Replace("FAST", "12345"); // PC #1: 208 ms, PC #2: 339 ms
    compiled.Replace(str, "12345"); // 1100 ms, 2708 ms
    interpreted.Replace(str, "12345"); // 788 ms, 2174 ms
    Regex.Replace(str, @"\bfast\b", "12345", RegexOptions.IgnoreCase); // 1076 ms, 3138 ms
}
Console.WriteLine((DateTime.UtcNow - start).TotalMilliseconds);

编译的正则表达式始终是最慢的正则表达式之一。我没有像您一样观察到 string.ReplaceRegex.Replace 之间的差异那么大,但它们处于相同的范围内。因此,请尝试不编译正则表达式。

还值得注意的是,如果您只有一个巨大的字符串,Regex.Replace 的速度非常快,在我的 PC 上处理 13,000 行《傲慢与偏见》大约需要 7 毫秒。

关于c# - 有什么方法可以提高 Regex.Replace 性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41371591/

相关文章:

c# - 如何将 IList 复制到相同类型的 IList?

c# - Windows 服务无法停止

c# - .NET MVC 4 WebAPI POST 不工作

带有 Oracle 数据库的 .NET 应用程序

c# 如何在客户端管理 wcf 服务代理生命周期?

c# - 替换 .net 词典

c# - 使用 LINQ 合并集合,同时覆盖具有相同 ID 的行

.net - 使用 PowerShell 连接到 Azure FTP 但在 C# 中工作时出现错误 501

c# - 如何在多线程应用程序中安全地使用 SmtpClient.SendAsync

c# - 如何在 C# .Net 中使用 InsertOneAsync 将文档插入到 MongoDB 并返回相同的文档或其 ID