0

在 Android SDK 上工作,它是 Java 减去一些东西。

我有一个从网页中提取两个正则表达式模式的解决方案。我遇到的问题是它在 HTML 标记中查找内容。我尝试了 jTidy,但它在 Android 上太慢了。不知道为什么,但我的扫描仪正则表达式匹配解决方案多次鞭打它。

目前,我将页面源抓取到 IntputStream

is = uconn.getInputStream();

以及这样的匹配和提取:

Scanner scanner = new Scanner(in, "UTF-8");
String match = "";   
while (match != null) {   
    match = scanner.findWithinHorizon(extractPattern, 0);   
    if (match != null) {   
        String matchit = scanner.match().group(grp);  

它工作得很好而且速度很快。

我的正则表达式模式已经有点疯狂了,实际上是一个或这样的两个模式 (p1|p2)

关于我如何做到这一点“但不在 HTML 标签内”或在开始时排除 HTML 标签的任何想法?如果我可以从我的源代码中排除 HTML 标签,这可能会显着加快我的界面速度,因为我还有一些其他事情需要处理原始数据。

4

2 回答 2

1

为什么不使用javax.xml.parsers来解析 HTML(ergo xml)

于 2010-09-07T17:05:33.800 回答
1

您可以做的一件事是为右尖括号添加前瞻:

(p1|p2)(?![^<>]*+>)

这个想法是,在找到匹配项后,向前扫描一点;如果您在没有首先看到左括号的情况下找到右括号,则匹配必须发生在标签内,因此拒绝它。但是请注意,即使在格式良好的 HTML 中,也有很多东西会弄乱你,比如 SGML 注释、CDATA 部分,甚至是属性值中的尖括号。

另一种方法是匹配标签并忽略这些匹配:

((?:<[^<>]++>)++)(p1|p2)

然后您测试是否是匹配的组 #1:

MatchResult match = scanner.match();
if (match.start(1) != -1) {
    // keep searching
}

但同样,由于我上面提到的原因,作为一个通用解决方案,这太脆弱了。如果您确定它与您正在处理的特定页面兼容,则应该只使用其中一种解决方案(或任何正则表达式解决方案)。

于 2010-09-07T17:29:28.597 回答