为什么Mono会锁定正则表达式

时间:2010-07-19 20:52:08

标签: regex mono

这是linux上的单声道锁定(我在官方网站上使用2.6.4 VM发行版)

var match = Regex.Match(sz, linkPattern);

字符串是获取链接和标题的字符串。

var linkPattern = @"<\ba\b[^\>]*\bhref\b*=\b*""([^""\>]*)""[^\>]*\btitle\b*=\b*""([^""\>]*) by [^""\>]*""";

当单声道击中该行时它不会崩溃,抛出异常或任何东西。使用tops我看到单声道使用96%的CPU。我不知道字符串有多长。我怀疑它的&lt; 8kb(我测试了一个不同的url),因为我运行代码所以它已经有几分钟了,所以必须要打破一些东西。

2 个答案:

答案 0 :(得分:2)

“太多\b”是我的第一反应。但是真的:

\b表示单词边界。在我看来,<\ba<a应该是相同的。此外,\b*因此意味着“可选择重复词边界”,这听起来相当混乱。

我想我从未使用\b,而是使用了\s?\s*

您是否尝试使用其他正则表达式引擎(Perl,PHP)来确定锁定是否归因于Mono?

答案 1 :(得分:1)

Mono的正则表达式实现中存在一些错误,可能导致它无限递归。可能唯一的解决方法是将模式重写为更简单的正则表达式,或者不使用正则表达式来执行此任务。

您可能还想提交错误。我认为Google Summer of Code学生目前正在使用Mono的正则表达式引擎。