2

.NET特定のタグを取得するために、プロジェクトで正規表現に取り組んでいます。DIV タグ全体とその内容を一致させたい:

<html>
   <head><title>Test</title></head>
   <body>
     <p>The first paragraph.</p>
     <div id='super_special'>
        <p>The Store paragraph</p>
     </div>
     </body>
  </head>

コード:

    Regex re = new Regex("(<div id='super_special'>.*?</div>)", RegexOptions.Multiline);


    if (re.IsMatch(test))
        Console.WriteLine("it matches");
    else
        Console.WriteLine("no match");

私はこれを一致させたい:

<div id="super_special">
   <p>Anything could go in here...doesn't matter.  Let's get it all</p>
</div>

すべての文字を取得するはずだった.のですが、キャリッジ リターンに問題があるようです。私の正規表現には何が欠けていますか?

ありがとう。

4

11 に答える 11

6

どうぞ、どうぞ、どうぞ、ご自身に多大な恩恵をもたらしてください。HTML の解析には HTML パーサーを使用してください。真剣に。それが彼らの目的です。

HTML は非常に複雑な言語です。調整、いじり、修正、正規表現の改良にどれだけ長く取り組んでいても、見逃しているケースは常にあります。

とにかく、正規表現エンジンに 1 行だけではなく複数行を一致させるように指示する必要があります。最も人気のあるもののいくつかでは、/m修飾子を適用してそれを行います。

繰り返しますが、HTML パーサーを使用してください。だれかが正規表現を使って HTML を解析するたびに、子猫が死んでしまいます...

于 2008-09-17T01:43:00.063 に答える
1

問題は、. デフォルトでは、メタ文字は改行と一致しません。これを実現するには、単一行修飾子を使用する必要があります。.NET では、使用しているメソッドの最後のパラメーターとして RegexOptions.SingleLine を使用するか、パターンで修飾子を直接使用できます。

(?s)(<div id="super_special">.*?</div>)
于 2008-09-17T01:43:25.490 に答える
1

ほとんどの言語には、 を作成する何らかの方法があります。改行に一致:

  • Java の場合: Pattern.compile("pattern", Pattern.MULTILINE);
  • Perl および Ruby の場合: /pattern/m
  • VB の場合: Regex.IsMatch(s, "pattern", RegexOptions.Multiline)

一般に、XML/HTML タグはネストできるため、正規表現を使用して XML/HTML を照合することはお勧めできません。次に例を示します。

  <div id="super_special">
     <div>Nothing</div>
     <p>Anything could go in here...doesn't matter.  Let's get it all</p>
  </div>

...ここでは、簡単に一致する可能性があります:

  <div id="super_special">
     <div>Nothing</div>

一方、照合する HTML が正規表現に対して常に安全であることが確実にわかっている場合は、私に止めさせないでください (それでも、潜在的なデバッグから将来の自分を救うことについてよく考える必要があります)。頭痛)。

于 2008-09-17T01:48:09.923 に答える
1

使用している言語によって異なります。たとえば、perl では正規表現修飾子を使用します。

m{<div id="super_special">.*?</span>}s
于 2008-09-17T01:37:19.983 に答える
1

どの言語を使用していますか? .NET では、単一行にならないようにオプションを設定する必要があります。

于 2008-09-17T01:37:45.317 に答える
1

言語によって異なります。Python の場合、次のように re.S フラグがありません (一致を削除するため):

re.compile('<div id="super_special">.*?</div>',re.S).sub(your_html,'')

他の正規表現の実装にも同様のフラグが存在し、それらは「Single Line」または「Multi Line」などと呼ばれます。

ただし、HTML の解析に REGEXPS を使用しないでください。整備地獄への直通道です。Beautiful Soup のような HTML パーサーを使用します。その方向に役立つリソースについては、これらの リンクを確認してください。

于 2008-09-17T01:38:42.817 に答える
1

すぐに使用できる特別な修飾子がなくても、ほとんどの正規表現の実装は、行末を越えてテキストを照合することはありません。おそらく、そのような修飾子に使用している正規表現エンジンのドキュメントを参照する必要があります。

もう 1 つアドバイスがあります。貪欲に気をつけてください。伝統的に、正規表現貪欲です。つまり、あなたの正規表現はおそらくこれと一致するでしょう:

<div id="super_special">
  I'm the wanted div!
</div>
<div id="not_special">
  I'm not wanted, but I've been caught too :(
</div>

「貪欲ではない」修飾子をチェックして、最後のものではなく、最初の出現時に正規表現がテキストの一致を停止するようにする必要があります。</div>

また、他の人が言ったように、正規表現の代わりに HTML パーサーを使用することを検討してください。それはあなたの頭痛を大幅に軽減します。

<div>編集: s がネストされている場合、貪欲でない正規表現でも期待どおりに機能しません! HTML パーサーの使用を検討するもう 1 つの理由。

于 2008-09-17T01:50:27.203 に答える
0

正規表現だけでは、問題を解決するには強力ではありません。文脈自由文法など、より強力なものが必要です。ウィキペディアのチョムスキー階層を参照してください。

つまり (前に述べたように)、正規表現を使用して HTML を解析しないでください。

于 2008-09-21T10:51:49.497 に答える
0

. (ドット) 改行文字 \r および \n を除く任意の 1 文字に一致します。ほとんどの正規表現フレーバーには、ドット マッチの改行文字も作成するオプションがあります。. x または (ほぼ) その他の任意の文字に一致

于 2008-09-17T01:38:33.940 に答える
0

多分: 。[\r\n] . [\r\n]

于 2008-09-17T01:38:35.597 に答える
0

これらの正規表現の提案はどれも機能しません。それらが貪欲であるかどうかに応じて、ドキュメントの最後の </div> または開始文字列の後の最初の </div> のいずれかに一致します。に興味がある。

正規表現は、この目的には理想的なツールではありませんが、HTML を解析したくないほど単純な状況である場合は、.NET で利用可能な正規表現に対する Microsoft 独自の拡張機能を使用してこれを行うことができます。わかりやすい説明については、Morten Maate によるこのすばらしい記事を参照してください。

于 2008-09-17T02:41:23.557 に答える