首页新闻找找看学习计划

正则卡死 问题

0
悬赏园豆:100 [已解决问题] 解决于 2017-07-03 17:34
 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多字节

问题补充:

正则表达式是用来 匹配成对的html标记的

很单纯的 控制台程序 没有多线程

生活是平淡的的主页 生活是平淡的 | 初学一级 | 园豆:71
提问于:2012-11-03 20:45
< >
分享
最佳答案
1
可能没替换掉,死循环了。
不过也可以这么写:
if
(Regex.IsMatch(html, patt)){  
  return clearFulltag(Regex.Replace(html,patt ,"$6"));
}
return html;
收获园豆:100
向往-SONG | 老鸟四级 |园豆:4853 | 2012-11-03 22:18
"$6" 是啥意思?

经过反复测试 我认为是 正则表达式过于复杂 导致 执行超时 而正则的超时不会引发异常 导致卡死
生活是平淡的 | 园豆:71 (初学一级) | 2012-11-04 09:01

@生活是平淡的: 

$6就是mc[i].Groups[6].Value。
你那个循环替换的简化写法就是Regex.Replace(html,patt ,"$6")。
===========================================
你在方法外面new 一个编译好的正则对象new Regex("xxx",RegexOptions.Complied),然后在里面使用试试。
向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-04 10:50
其他回答(3)
0

这个方法因该是不对的。

html.Replace(mc[i].Value, mc[i].Groups[6].Value);楼主检查下,应该是没替换直接进入死循环里。

````` | 园豆:14268 (专家六级) | 2012-11-05 11:30
0

你把参数html的示例值放上面,大家可以帮你测测看看是什么原因的。

LCM | 园豆:6876 (大侠五级) | 2012-11-05 13:09
0

正则表达式产生死循环了

az235 | 园豆:8263 (大侠五级) | 2012-11-07 10:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册