【问题标题】:Regex For Anchor Tag Pegging CPU用于锚定标签挂钩 CPU 的正则表达式
【发布时间】:2013-04-29 22:22:59
【问题描述】:

所以我将我的正则表达式分成两半,发现这一半导致 cpu 在负载下挂起。我可以做些什么来帮助节省性能?我真的找不到要刮的地方。

private string pattern = 
@"(<a\s+href\s*=\s*(\""|')http(s)?://(www.)?([a-z0-9]+\-?[a-z0-9]+\.)?wordpress.org(\""|'))";

Regex wordPressPattern = new Regex(regexPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);

【问题讨论】:

  • 编译正则表达式有影响吗?
  • @ChuckConway 我更新了代码,我将其标记为已编译。我相信这就是您所指的。
  • 正在评估的字符串有多大?
  • 使用 HTMLAgilityPack 解析 html。不要使用正则表达式。 stackoverflow.com/a/1732454/47589
  • 顺便说一句,您的意思是(www\.) 而不是(www.)

标签: c# regex performance


【解决方案1】:

唯一让我印象深刻的是这部分:

[a-z0-9]+\-?[a-z0-9]+

这个想法是匹配连字符的单词,如luxury-yachtTHX-1138,同时仍然允许单词没有连字符。麻烦的是,如果没有连字符,正则表达式引擎仍然必须选择如何在第一个 [a-z0-9]+ 和第二个之间分配字符。如果它尝试将word 匹配为w-o-r-(no hyphen)-d,并且正则表达式中的某些内容无法匹配,则它必须返回并尝试w-o-(no hyphen)-r-d,依此类推。这些努力毫无意义,但正则表达式引擎无法知道这一点。你需要给它一点帮助,像这样:

[a-z0-9]+(-[a-z0-9]+)?

现在您说:“如果您的字母数字用完了,而下一个字符是连字符,请尝试匹配更多的字母数字。否则,请继续下一部分。”但是在这种情况下,您不需要那么具体;您正在尝试查找 URL,而不是验证它们。我建议您将该部分替换为:

[a-z0-9-]+

这还允许它匹配带有多个连字符的单词(例如,james-bond,但也可以是 james-bond-007)。

您还有很多不必要的捕获组。您似乎没有使用捕获,因此您不妨使用ExplicitCapture 选项来进一步提高性能。但即使是纯粹的分组目的,大多数组似乎也不需要。我建议你试试这个正则表达式:

@"<a\s+href\s*=\s*[""']https?://([a-z0-9-]+\.)+wordpress\.org[""']"

...使用这些选项:

RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多