c#缓慢的正则表达式性能
本文关键字:性能 正则表达式 缓慢 | 更新日期: 2023-09-27 18:01:24
我是正则表达式的新手。如何优化这个正则表达式:
private static readonly Regex rgx = new Regex(@"(.*)</([a-z]+)>([0-9.]+)<(.*)", RegexOptions.Compiled);
我在一个递归函数上使用了它:
private static string ReplaceMe(string temp)
{
if (rgx.IsMatch(temp))
{
temp = rgx.Replace(temp, delegate(Match m)
{
return m.Groups[1].Value + "</" + m.Groups[2].Value + "><span style='"display:inline'">" + m.Groups[3].Value + "</span><" + m.Groups[4].Value;
});
return ReplaceMe(temp);
}
return temp;
}
分析器说语句:
if (rgx.IsMatch(temp))
导致性能问题,所以我需要优化正则表达式。
编辑:我最终使用regex
([^<]*)</([a-z]+)>([0-9.]+)<(.*)
您的regexp有点容易发生灾难性的回溯。因为(.*)
可以和</([a-z]+)
重叠。如果您搜索的文本没有找到匹配项,那么就会产生问题,因为有很多标签,因此第二组可以从很多地方开始。
但是,除非您告诉我们您打算如何使用regexp,否则我们无能为力。
你可以考虑
</([a-z]+)>([0-9.]+)<
或
([^<]*)</([a-z]+)>([0-9.]+)<(.*)
或者您可能想使用xml解析器
在某些情况下,如果您使用RegexOptions.Compiled,则性能不是很好。
看这里
尝试删除RegexOptions。编译,看看是否更好。