【发布时间】:2015-07-08 13:12:59
【问题描述】:
我的正则表达式匹配的时间越来越长(第 5 次大约需要 30 秒),但需要应用大约 500 轮匹配。 我怀疑灾难性的回溯。 请帮忙!我该如何优化这个正则表达式:
String regex = "<tr bgcolor=\"ffffff\">\\s*?<td width=\"20%\"><b>((?:.|\\s)+?): *?</b></td>\\s*?<td width=\"80%\">((?:.|\\s)*?)(?=(?:</td>\\s*?</tr>\\s*?<tr bgcolor=\"ffffff\">)|(?:</td>\\s*?</tr>\\s*?</table>\\s*?<b>Tags</b>))";
编辑:因为不清楚(我的错):我试图通过提取两个搜索组并随后添加格式来获取一个 html 格式的文档并重新格式化。
【问题讨论】:
-
通常的答案是:不要在 HTML 或 XML 上使用正则表达式......
-
@Bruce 你会如何解决这种问题?
-
你有
(?:.|\\s)+?,这是非常低效的。将其更改为.+?并使用Pattern.DOTALL(或模式开头的(?s))要好得多(或者如果您不想使用dotall 标志,只需使用[\\s\\S]+?)。但是最好使用 jsoup 或其他基于 HTML 解析器的解决方案。 -
@stribizhev 谢谢你,我会检查它是否足够快,或者我是否会改变我的解决方案。实际上有70K行要匹配..