用于在HTML中查找URL的RegEx在JavaAndroid中需要25秒

用于在HTML中查找URL的RegEx在JavaAndroid中需要25秒,第1张

概述在Android/Java中,给定网站的HTML源代码,我想提取所有XML和CSV文件路径.我正在做什么(使用RegEx)是这样的:finalHashSet<String>urls=newHashSet<String>();finalPatternurlRegex=Pattern.compile("[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|].(x

在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秒所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1115600.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存