正则表达式用于锚标签挂钩 CPU
本文关键字:CPU 标签 用于 正则表达式 | 更新日期: 2023-09-27 18:11:20
所以我把我的正则表达式分成两半,发现这一半导致 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);
作为性能下沉,我唯一跳出来的是这部分:
[a-z0-9]+'-?[a-z0-9]+
这个想法是匹配带连字符的单词,如luxury-yacht
或THX-1138
,同时仍然允许没有连字符的单词。 问题是,如果没有连字符,正则表达式引擎仍然必须选择如何在第一个[a-z0-9]+
和第二个之间分配字符。 如果它尝试将word
匹配为 w-o-r-(no hyphen)-d
,并且正则表达式中稍后的内容不匹配,则必须返回并尝试w-o-(no hyphen)-r-d
,依此类推。 这些努力毫无意义,但正则表达式引擎无法知道这一点。 你需要给它一点帮助,比如:
[a-z0-9]+(-[a-z0-9]+)?
现在你说,"如果你用完了字母数字,下一个字符是连字符,试着匹配更多的字母数字。 否则,请继续下一部分。 但在这种情况下,您不需要如此具体;您尝试查找网址,而不是验证网址。 我建议您将该部分替换为:
[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