在一个应用程序中使用foreach而不是另一个应用程序中的MatchCollection挂起

时间:2011-08-07 10:05:06

标签: c# .net regex winforms

我刚刚在编码生涯中遇到了一个最奇怪的问题,我在项目中使用了code highlight library,我试图自定义SQL代码查看器。我从示例中获取了一个示例表单并将其放入项目中,并在启动时将表单挂起。但是同样的示例在库中附带的示例项目中运行良好。这两个都是Winform应用程序。并且更进一步的调查显示,代码挂起在库本身,而不是样本表单中的代码

var matches = regex.Matches(text);
foreach (Match m in matches) // Here it hangup
{
    ...
}

但是当我运行示例winform应用程序时,同样的地方运行得像snappy一样。我很困惑。我认为像Regex这样基本的东西无论在哪个应用程序中都应该执行相同的操作。文字不长,只有几百个字符。正则表达式是一样的。除了我提取样本表单并将其放入我的项目并调用它之外,我没有做任何不同的事情。

有人可以帮助我或指出正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您认为某些“与正则表达式一样基本”的内容在实现中的表现相同是错误的,原因如下:

  • 正则表达式不再常规。几十年前基本的正则表达式大大扩展了后向引用,外观表达,递归模式匹配等现代附加功能。
  • 那里有dozens of regex flavors,每个实现不同的功能子集,许多以不同的方式解释相同的令牌。对你来说,JavaScript(客户端)和.NET(服务器端)正则表达式之间的区别可能是最相关的,而男孩,这两者是不同的。
  • 可以设置许多参数(例如点是否匹配换行符),这将影响正则表达式的匹配方式(并且可能会影响性能),并且需要确保正确设置这些参数。 / LI>

最有可能的是,您遇到了一个名为catastrophic backtracking的问题。图书馆内部的“悬挂”通常是由此引起的。要查明是否是这种情况以及如何纠正它,我们需要查看您的正则表达式,解释您正在尝试使用它和/或输入文本的样本,它有问题。请修改您的问题并添加这些详细信息。