4

階層データに一致する単一の正規表現を構築することは可能/実用的ですか?

例えば:

<h1>Action</h1>
  <h2>Title1</h2><div>data1</div>
  <h2>Title2</h2><div>data2</div>
<h1>Adventure</h1>
  <h2>Title3</h2><div>data3</div>

試合で締めくくりたい。

"Action", "Title1", "data1"
"Action", "Title2", "data2"
"Adventure", "Title3", "data3"

私が見たように、これにはここで階層構造が作用していることを知る必要があり、H1 をキャプチャするパターンをコーディングすると、その階層の最初のエントリにのみ一致します。H1 をコーディングしないと、キャプチャできません。これを解決するために私が採用している特別なトリックがあるかどうか疑問に思っていました.

これは .NET プロジェクトです。

4

3 に答える 3

5

解決策は、正規表現を使用しないことです。彼らはこの種のことには十分に強力ではありません。

必要なのはパーサーです。HTML に一致させようとしているように見えるので、選択肢はたくさんあります。

于 2010-02-11T00:18:17.723 に答える
2

HTML/XML を RegEx で解析しようとするのは一般的に悪い習慣だと考えられています。そのために再帰関数を使用することもできますが、この場合のより良い解決策は、実際の XML パーサーを使用することです。使用しているプラ​​ットフォームを知らなければ、これ以上のアドバイスはできません。

編集: 正規表現も非常に遅いです。これは、HTML の処理に適していないもう 1 つの理由です。ただし、XML/DOM プロセッサの方がより多くのメモリを使用する可能性が高いため、より高速になる可能性があるかどうかはわかりません。

実証したような単純なドキュメントからデータが必要な場合、および/または自分でソリューションを構築したい場合は、それほど難しくありません。タグを探してコンテンツを次の再帰レベルに渡す単純な再帰的な状態ベースのストリーム プロセッサを構築するだけです。

例えば:

- In a recursive function, seek out a "<" character.
- Now find a ">" character.
- Preserve everything you find until the next "<" character.
- Find a ">" character.
- Pass whatever you found between those tags into the recursive function.

自分でエラー チェックを行う必要がありますが、基本的なケース (以前のレベルに戻ったとき) は、他に何も見つからない場合です。

これは役立つかもしれませんが、そうでないかもしれません。頑張って。

于 2010-02-11T00:17:58.973 に答える
0

正規表現は、このタイプのデータには機能しません。それ自体は規則的ではありません。

これには XML パーサーを使用する必要があります。

于 2010-02-11T00:17:07.473 に答える