作为性能下降器,唯一让我感到震惊的是这部分:
[a-z0-9]+\-?[a-z0-9]+
这个想法是匹配带连字符的单词luxury-yacht
or THX-1138
,同时仍然允许没有连字符的单词。麻烦的是,如果没有连字符,正则表达式引擎仍然必须选择如何在第一个[a-z0-9]+
和第二个之间分配字符。如果它尝试匹配word
as 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