【问题标题】:Why does Mono locks up on regex为什么 Mono 会锁定正则表达式
【发布时间】:2010-07-20 06:52:32
【问题描述】:

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

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

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

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

当单声道命中该行时,它不会崩溃,抛出异常或任何东西。使用顶部我看到单声道使用 96% 的 CPU。我不知道字符串有多长。我怀疑它的

【问题讨论】:

  • 说真的。您应该使用解析器。我真的不知道这个简单的事实有什么难理解的,“如何使用正则表达式进行 HTML 解析”——这里的经验丰富的用户也必须提出这些问题。 :-\
  • 这是一个有效的正则表达式吗? \b* 是什么意思?此外,有关该问题的更多数据可能会有所帮助。

标签: regex mono


【解决方案1】:

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

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

我想我从来没有使用过\b,而是使用了\s?\s*

您是否尝试了不同的正则表达式引擎(Perl、PHP)来确定锁定是否是由于 Mono 造成的?

【讨论】:

  • 你说得对,&lt;\ba 中的 \b 毫无意义。至于\b*,看起来应该是\s*:零个或多个空白字符。
  • 我不知道我为什么写那个,这是旧代码,但 \b* 是问题,\s* 是解决方案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2017-01-10
    • 2018-06-28
    • 1970-01-01
    • 2011-06-15
    • 2017-08-11
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多