【发布时间】:2015-02-20 11:14:26
【问题描述】:
我在 C# 中遇到正则表达式性能问题。
我需要替换一个非常大的字符串(270k 字符,不要问为什么..)。正则表达式匹配大约 3k 次。
private static Regex emptyCSSRulesetRegex = new Regex(@"[^\};\{]+\{\s*\}", RegexOptions.Compiled | RegexOptions.Singleline);
public string ReplaceEmptyCSSRulesets(string css) {
return emptyCSSRulesetRegex.Replace(css, string.Empty);
}
我传递给方法的字符串如下所示:
.selector-with-statements{border:none;}.selector-without-statements{}.etc{}
目前,替换过程在 C# 中占用 1500ms,但当我在 Javascript 中执行完全相同的操作时,它只需要 100ms。
我用来计时的Javascript代码:
console.time('reg replace');
myLargeString.replace(/[^\};\{]+\{\s*\}/g,'');
console.timeEnd('reg replace');
我还尝试通过以相反的顺序循环匹配并替换 StringBuilder 中的字符串来进行替换。这没有帮助。
在这种情况下,我对 C# 和 Javascript 之间的性能差异感到惊讶,我认为我做错了什么,但我什么都想不出来。
【问题讨论】:
-
我认为用于 JS 和 C# 的正则表达式引擎是不同的。您不应该比较不同语言的功能。我不确定 C# 但在 Java 中,创建正则表达式(当你做
matches()时)本身是一个耗时的过程。它涉及同步和其他耗时的东西。 -
尝试将
\s更改为[\f\n\r\t\v\u00A0\u2028\u2029]或使用RegexOptions.ECMAScript。在 JS 和 C# 中处理字符类的方式存在差异 -
@TheLostMind 我同意,但差别很大......所以这可能是我在 C# 中做错了什么的信号。我正试图找出究竟是什么。
-
@stribizhev 你认为正则表达式有问题吗?这与 javascript 正则表达式执行时间不对应。但是我做了一个只匹配而不替换的测试,这在 C# 中很快。
标签: c# regex performance replace