【发布时间】:2009-09-29 08:06:01
【问题描述】:
我的正则表达式在 Windows Server 2008 上的编译速度非常慢。我编写了一个小型控制台应用程序来突出这个问题。该应用程序生成自己的输入并从 XML 文件中的单词构建正则表达式。我构建了这个应用程序的发布版本,并在我的个人笔记本电脑(运行 XP)和 Windows 2008 服务器上运行它。正则表达式在我的笔记本电脑上编译需要 0.21 秒,但在服务器上编译需要 23 秒。
任何想法可能导致这种情况?问题仅在第一次使用正则表达式时(第一次编译时 - 之后就可以了)
我还发现了另一个问题 - 在同一 Windows 2008 服务器上的正则表达式中使用 \s+ 时,内存气球(使用 4GB+)和正则表达式的编译永远不会完成。
Regex 和 64 位 .net 是否存在已知问题?是否有可用的修复/补丁?我在网上找不到任何信息,但我在 Framework 2.0 中找到了一些关于同样问题的文章 - 现在肯定已经解决了吗?
更多信息:
服务器运行 .net 框架 (3.5 SP1) 的 64 位版本,在我的笔记本电脑上我安装了 Visual Studio 2008 和 3.5 框架。正则表达式具有以下模式:^word$|^word$|^word$,并使用以下标志构造:RegexOptions.IgnoreCase | RegexOptions.Compiled
这是一个代码sn-p:
StringBuilder regexString = new StringBuilder();
if (!String.IsNullOrEmpty(fileLocation))
{
XmlTextReader textReader = new XmlTextReader(fileLocation);
textReader.Read();
while (textReader.Read())
{
textReader.MoveToElement();
if (textReader.Name == "word")
{
regexString.Append("^" + textReader.GetAttribute(0) + "$|");
}
}
ProfanityFilter = new Regex(regexString.ToString(0, regexString.Length - 1), RegexOptions.IgnoreCase | RegexOptions.Compiled);
}
DateTime time = DateTime.Now;
Console.WriteLine("\nIsProfane:\n" + ProfanityFilter.IsMatch("test"));
Console.WriteLine("\nTime: " + (DateTime.Now - time).TotalSeconds);
Console.ReadKey();
这导致我的笔记本电脑上的时间为 0.21 秒,而 2008 服务器上的时间为 23 秒。 XML 文件由 168 个单词组成,格式如下:
<word text="test" />
【问题讨论】:
-
正则表达式和xml的代码示例怎么样?