0

私は、Processing スケッチで HTML ファイルを解析しようとしている初心者のプログラマーです。(ちなみに、Processing を知らない場合は、Java にコンパイルされ、同じ正規表現関数を使用します)。SimpleML を使用して、HTML ファイルを単一の文字列として正しくキャプチャしました。キャプチャしようとしているデータは、次のようにテーブルから取得されます。

<th>Name</th>
    <th>John F. Kennedy</th>
    <th>Lyndon Johnson</th>
    <th>Richard Nixon</th>

候補の名前を解析して配列に入れたい(「名前」を削除)。

だから私は最初に試しました

    candidates = match(rawString,"<th>.*</th>");

リスト全体を返しました。

それから私は試しました

    candidates = match(rawString,"<th>.{1,50}</th>");

のみを返します

<th>Name</th>

処理のドキュメントには次のように記載されています。

正規表現に (括弧のセットで指定された) グループがある場合、それぞれの内容が配列に返されます。正規表現一致の要素 [0] は一致する文字列全体を返し、一致グループは要素 [1] から始まります (最初のグループは [1]、2 番目のグループは [2] など)。

だから今、私は次のようなグループと量指定子のさまざまな組み合わせを試してきました:

    candidates = match(rawString,"(<th>.{1,50}</th>)*");

しかし、何も機能していないため、私が得ていない概念的な部分があるに違いありません。これは簡単なはずですよね?

4

2 に答える 2

1

HTML を正規表現で解析することは、通常は良い考えではありませんが、ここではそれでうまくいくかもしれません。

あなたの問題は、.*貪欲に、つまりできるだけ多くの文字に一致することであったようです。これにより、文字列<th>の最初から最後まですべてが一致</th>します。

それを怠惰にすること、つまり量指定子に可能な限り一致しないように指示することは、1 つの解決策です。

<th>.*?</th>

おそらくうまくいくでしょう。

もう少し安定して最小限に高速化: エンジンに何を照合できるかを正確に伝えます。次に例を示します。

<th>[^<>]*</th>

[^<>]「山かっこを除く任意の文字」を意味します。

ネストされた構造を正規表現と照合しようとすると、問題が発生します。最新の正規表現のフレーバーで実行できますが、正しく実行するのは非常に困難です。ミックスに HTML コメントと文字列を追加すると (照合対象の区切り文字が含まれている可能性があります)、大きな問題が発生します。

于 2010-12-05T15:25:52.067 に答える
1

matchAll式が複数回一致することが予想される場合は、おそらくメソッドが必要です。matchパターンが 1 回だけ一致すると予想されるため、最初に見つかった結果のみが返されます。

http://www.processing.org/reference/matchAll_.html

于 2010-12-05T15:43:08.040 に答える