0

私はこれに似た文字列を持っています

<td><p>alakjsdlajsdlkj</p><p><b>asdkjalsdkjaskldj</b></p><p>asdjlaksjdlaksjd</p></td>

タグ間のすべてを取得するための正規表現は何ですか?

以下(HTMLを含む)を取得したい

<p>alakjsdlajsdlkj</p><p><b>asdkjalsdkjaskldj</b></p><p>asdjlaksjdlaksjd</p>
4

4 に答える 4

2

これは正規表現では実現できません。主に、それが見たものの数を追跡するメカニズムがないという点で、それらは十分に説明的/強力ではありません。要するに、これは正規表現メカニズムにスタックの概念がないためです (スタックは有限状態マシンを表し、プッシュダウン オートマトンではありません)。

たとえば、次のパターンを考えてみましょう<p>(.*)</p>。貪欲モード (可能な限り一致) を使用し、 のような文字列がある<p>first</p><p>second</p>場合、一致は になりますfirst</p><p>second。非貪欲モード (最小の一致を可能にする) を使用して のような文字列を取得した<p><p>stuff</p></p>場合は、一致した が返されます<p>stuff。したがって、どちらのモードもすべてのケース (または任意のケース) を十分にカバーしません。

@kristopher が指摘しているように、一致内に別のタグを含めることを回避するパターンを持つことは可能ですが、これは最も内側のタグにのみ一致します。

必要なことを確実に行うには、実際のパーサーが必要です。いくつかの html 解析ソリューションが他の人によって作成されています。または、単純な解析が必要な場合は、独自のソリューションを作成できる場合があります。

于 2012-10-04T02:09:22.303 に答える
1

HTMLパーサーを使用できず、tdと終了tdが文字列の最初と最後にある場合:

^<td>(.*)</td>$
于 2012-10-04T02:01:59.110 に答える
1

これを試してください。最も外側のタグと一致し、グループ内の内側の文字列を返す必要があります

^<\w+>(.*)</\w+>$

ただし、正しいネストなどはチェックされません。可能であれば、適切なフレームワークを使用してください。

于 2012-10-04T02:03:15.827 に答える
1

タグがネストされている場合、これはすぐに面倒になります。

html パーサー ライブラリを使用できませんか? そうする方がはるかに良いでしょう。

<([^>]+)>([^<]+)</\1>

山かっこで囲まれた任意の文字列に加えて、次のタグまでの任意の文字を取得します

ただし、これはネストされたタグまたは不一致のタグを処理しません

<div>test <b>nested</b></div>

< div > はそれ自身のタグの終わりに遭遇する前に < b > の開始に遭遇するため、div ではなく < b > のみをキャッチします。

于 2012-10-04T01:58:17.760 に答える