正则表达式也可以让资源崩溃

作者:vkvi 来源:ITPOW(原创) 日期:2021-8-1
Regex regex = new Regex("<a(.|\r|\n)+?href=[\"'](.*?)[\"'](.|\r|\n)+?</a>");
MatchCollection matchs = regex.Matches(contents);
Response.Write(matchs.Count.ToString());

如上这个正则表达式,试图找出 <a href 这种超链接,当执行到第 3 句时,总是导致 CPU 100%。

后来发现当文章(contents)中具有 a 标签,但是这个 a 标签没有 href 属性时,就会出现上述现象。

原来呀,正则表达式的匹配算法并不高大上,假设 contents 是 <a name="itpow"></a>。

<a 匹配没问题,空格与 (.|\r|\n)+? 匹配没问题,由于 +? (懒惰匹配)表示至少匹配一个,且尽量少地匹配,就是这个且尽量少地匹配,于是它将 n 与 href 的 h 进行匹配,发现不匹配,于是把 n 交回给 (.|\r|\n)+? 匹配,发现匹配,于是判断下一个字符 a,将 a 与 href 的 h 进行匹配,发现不匹配……

怎么样,听着都觉得累啊,这个“指针”前前后后、反反复复地移动,累不累呀,所以文章(contents)稍微一长,CPU 就 100% 了。

有兴趣也可以参考下这篇文章:一个正则表达式导致CPU 利用率居高不下_正则表达式_脚本之家 (jb51.net)

相关文章