1 private static string clearFulltag(string html)//去除成对标签 2 { 3 string patt = @"<([a-zA-Z0-9]+)(\s*([a-zA-Z]+)\s*=\s*([""'])[\s\S]*?\4|\s+([a-zA-Z]+)\s*=\s*\S*)*?\s*>([\s\S]*?)</\1\s*>"; 4 Console.WriteLine(Regex.CacheSize); 5 if (Regex.IsMatch(html, patt)) 6 { 7 MatchCollection mc = Regex.Matches(html, patt); 8 int count = mc.Count; 9 for (int i = 0; i < count; i++) 10 { 11 html = html.Replace(mc[i].Value, mc[i].Groups[6].Value); 12 } 13 html = clearFulltag(html); 14 } 15 return html; 16 }
问题 在进入 13后 递归该函数 执行到 5 的时候卡死 是啥原因??? 调试也不报错 一直卡在那 等了 几个小时 还是没反应! 参数html不大 才 1000多字节
可能没替换掉,死循环了。
不过也可以这么写:
if (Regex.IsMatch(html, patt)){
return clearFulltag(Regex.Replace(html,patt ,"$6"));
}
return html;
"$6" 是啥意思?
经过反复测试 我认为是 正则表达式过于复杂 导致 执行超时 而正则的超时不会引发异常 导致卡死
@生活是平淡的:
$6就是mc[i].Groups[6].Value。
你那个循环替换的简化写法就是Regex.Replace(html,patt ,"$6")。
===========================================
你在方法外面new 一个编译好的正则对象new Regex("xxx",RegexOptions.Complied),然后在里面使用试试。
你把参数html的示例值放上面,大家可以帮你测测看看是什么原因的。
正则表达式产生死循环了