用于在HTML中查找URL的RegEx在Java / Android中需要25秒
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用于在HTML中查找URL的RegEx在Java / Android中需要25秒,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1905字,纯文字阅读大概需要3分钟。
内容图文
![用于在HTML中查找URL的RegEx在Java / Android中需要25秒](/upload/InfoBanner/zyjiaocheng/753/af9b074fe9a04ae6b7fdb738128efbba.jpg)
在Android / Java中,给定网站的HTML源代码,我想提取所有XML和CSV文件路径.
我正在做什么(使用RegEx)是这样的:
final HashSet<String> urls = new HashSet<String>();
final Pattern urlRegex = Pattern.compile(
"[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|].(xml|csv)");
final Matcher url = urlRegex.matcher(htmlString);
while (url.find()) {
urls.add(makeAbsoluteURL(url.group(0)));
}
public String makeAbsoluteURL(String url) {
if (url.startsWith("http://") || url.startsWith("http://")) {
return url;
}
else if (url.startsWith("/")) {
return mRootURL+url.substring(1);
}
else {
return mBaseURL+url;
}
}
不幸的是,这对于长度正常的普通网站来说大约需要25秒.出了什么问题?我的RegEx是不是很糟糕?或者RegEx是如此之慢?
没有RegEx,我能更快找到网址吗?
编辑:
有效字符的来源是(大致)this answer.但是,我认为必须交换两个字符类(方括号),以便为URL的第一个字符设置更有限的字符集,为所有字符设置更广泛的字符类.剩余的角色.这是意图.
解决方法:
正则表达式的编写方式使得长输入变慢.
*运算符是贪心的.
例如输入:
https://stackoverflow.com/questions/19019504/regex-to-find-urls-in-html-takes-25-seconds-in-java-android.xml
[-a-zA-Z0-9& @#/%?= ~_ |!:,.;]正则表达式的一部分将使用整个字符串.然后它将尝试匹配下一个字符组,这将失败(因为整个字符串被消耗).然后它将在正则表达式的第一部分的匹配中回溯一个字符并尝试再次匹配第二个字符组.它会匹配.然后它将尝试匹配点并失败,因为整个字符串被消耗.另一个回溯等……
从本质上讲,你的正则表达式正在强制进行大量的回溯以匹配任何东西.它也会浪费很多时间在无法取得成功的比赛上.
对于单词林,它将首先在表达式的第一部分中消耗整个单词,然后在未能匹配表达式的其余部分后重复地回溯.浪费大量时间.
也:
>.在正则表达式是未转义的,它将匹配任何字符.
> url.group(0)是多余的. url.group()具有相同的含义
为了加速正则表达式,你需要找到一种减少回溯量的方法,如果你没有一般的比赛开始,它也会有所帮助.现在每个单词都会导致匹配开始并且通常会失败.例如,通常在html中,所有链接都在2“内.如果是这种情况,你可以开始匹配”,这将极大地加速它.尝试找到一个更好的表达开始.
内容总结
以上是互联网集市为您收集整理的用于在HTML中查找URL的RegEx在Java / Android中需要25秒全部内容,希望文章能够帮你解决用于在HTML中查找URL的RegEx在Java / Android中需要25秒所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。