【发布时间】:2012-12-26 13:48:53
【问题描述】:
我正在编写一个应用程序,该应用程序旨在处理具有大量自旋税的数千篇文章/条目,格式如下:
{Hello|Hi} {World|There!}, how are you?
但是,当我使用分析器运行应用程序时,我注意到处理 Regex 的部分占用了大量资源,并且由于内存不足问题,我的应用程序最终崩溃。任何人都可以提出一种改进我的代码的方法或更好的解析 spintax 的方法吗?
public static String Spin(String text)
{
Regex reg = new Regex(@"\{[^\{\}]*\}");
Random rand = new Random((int)DateTime.Now.Ticks);
while (true)
{
Match m = reg.Match(text);
if (!m.Success) break;
String[] parts = m.Value.TrimStart('{').TrimEnd('}').Split('|');
int i = rand.Next(parts.Length);
text = text.Substring(0, m.Index) + parts[i] + text.Substring(m.Index + m.Length);
}
return text;
}
【问题讨论】:
-
是您使用的实际正则表达式速度较慢还是代码的其余部分?你可以使用所有格量词来加速这个过程,以避免在给你带来麻烦时回溯。不过,我认为不会有太大变化。
-
我认为特别是 regex.match 部分占用了最多的资源。其余代码没问题。
-
我看到你的代码不支持嵌套的 spintaxes。是有意的吗?
-
不,这不是有意的。它应该支持嵌套的 spintaxes 但我不知道如何实现这一点。
-
Spin方法中的任何内容都不太可能导致内存泄漏。内存问题在您的代码中的其他地方。此外,如果这将被调用数千次,您应该将正则表达式设为静态(在方法外部定义),并在创建时使用RegexOptions.Compiled选项。