0

Android SDK での作業は、Java からいくつかのものを差し引いたものです。

Web ページから 2 つの正規表現パターンを引き出すソリューションがあります。私が抱えている問題は、HTML タグ内のものを見つけることです。jTidy を試してみましたが、Android では遅すぎました。理由はわかりませんが、スキャナーの正規表現一致ソリューションは何度も繰り返します。

現在、ページソースを InputStream に取得しています

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);  

それは非常にうまく機能し、高速です。

私の正規表現パターンはすでにちょっとクレイジーです。実際には、またはこのような2つのパターン(p1 | p2)

「HTMLタグ内ではなく」それを行う方法、または最初にHTMLタグを除外する方法についてのアイデアはありますか? ソースから HTML タグを除外できれば、生データを処理する必要がある他にいくつかの作業があるため、インターフェイスが大幅に高速化される可能性があります。

4

2 に答える 2

1

java.xml.parsersを使用してHTML(ergo xml)を解析してみませんか

于 2010-09-07T17:05:33.800 に答える
1

できることの 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 に答える