正则高手帮看看那里出现问题CPU 100% 本帖最后由 superliyubo 于 2012-05-05 12:35:54 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 String regex = "<table cellpadding=\"0\" cellspacing=\"0\" class=\"result\" id=\"\\d+\".*><tr><td class=f><h3 class=\"t\"><a.*href=\"([\\s\\S]*?)\".*target=\"_blank\">([\\s\\S]*?)</a>([\\s\\S]*?)<br>";感觉正则表达式可以优化。.*千万别这么弄,改成.*? 感觉你是.*用多了。 如果有换行 加上(?s),具体翻API。 设置断点就卡死在这里了while (m != null && m.find()) { //该正则在这里m.find卡死。。然后CPU就100%了 这个正则,可匹配度太高了,变成大量的回溯。比如这句话:String regex = "<table cellpadding=\"0\" cellspacing=\"0\" class=\"result\" id=\"\\d+\".*><tr><td class=f><h3 class=\"t\"><a.*href=\"([\\s\\S]*?)\".*target=\"_blank\">([\\s\\S]*?)</a>([\\s\\S]*?)<br>";中的第一个片段:id=\"\\d+\".*>建议修改成终止符法,不要让.*任意发挥:id=\"\\d+\"[^>]*>把结束条件加进去,避免匹配失败所导致的回溯。再比如第二个片段:<a.*href=这种匹配也比较麻烦,因为: .*是贪婪算法,可以一直匹配到全文结束,然后再回溯。应该修改为: .*?这种勉强算法,也就是能不匹配就不匹配。结合前面建议的终止符法,改造为:<a[^>]*?href= 建议一开始不要搞这么长的正则,慢慢来,逐步改造,逐步增加。 明显这样正则不对。建议最好别用正则分析网页,使用jsoup等开源工具比较好。 [\\s\\S]问题在这里!把这个改成“.”并在这个正则表达式最前面加上 (?s) 就可以了。 非常感谢大家的热心回答已经解决了,特别感谢 ldh911 紧急提问:java输出流,每次只想输出一部分字节流如何做 关于FIle的问题 在java中如何看字符串的地 利用poi操作excel的问题 调整JFrame大小的问题 请教! JSP和JDK的问题!! [急!]怎么在不用Map所有类的情况下,实现一个和Map类有相同功能和特性的类 急!有关参考书,50分酬谢 applet里怎么连接数据库啊,jdbc好象要用到odbc,有点麻烦,有什么更好的办法吗 eclipse的安装启动问题 为什么感觉现在学的java没用呢
感觉正则表达式可以优化。
.*千万别这么弄,改成.*? 感觉你是.*用多了。
while (m != null && m.find()) { //该正则在这里m.find卡死。。然后CPU就100%了
String regex = "<table cellpadding=\"0\" cellspacing=\"0\" class=\"result\" id=\"\\d+\".*><tr><td class=f><h3 class=\"t\"><a.*href=\"([\\s\\S]*?)\".*target=\"_blank\">([\\s\\S]*?)</a>([\\s\\S]*?)<br>";中的第一个片段:
id=\"\\d+\".*>建议修改成终止符法,不要让.*任意发挥:
id=\"\\d+\"[^>]*>把结束条件加进去,避免匹配失败所导致的回溯。
再比如第二个片段:
<a.*href=这种匹配也比较麻烦,因为:
.*是贪婪算法,可以一直匹配到全文结束,然后再回溯。
应该修改为:
.*?这种勉强算法,也就是能不匹配就不匹配。
结合前面建议的终止符法,改造为:
<a[^>]*?href=
建议一开始不要搞这么长的正则,慢慢来,逐步改造,逐步增加。
明显这样正则不对。
建议最好别用正则分析网页,使用jsoup等开源工具比较好。