1

C#の正規表現を使用して、文字列内のh2タグの間からコンテンツを削除しようとしています。

<h2>content needs removing</h2> other content...

私は次の正規表現を持っています。これは、テストに使用した正規表現バディソフトウェアによると、機能するはずですが、機能しません。

myString = Regex.Replace(myString, @"<h[0-9]>.*</h[0-9]>", String.Empty);

この後に実行されて他のすべてのHTMLタグを削除する別の正規表現があります。これは同じ方法で呼び出され、正常に機能します。なぜこれが機能しないのか誰かが私を助けることができますか?

4

3 に答える 3

4

正規表現は使用しないでください。

HTMLは正規言語ではないため、正規表現では正しく解析できません。

たとえば、正規表現は次のように一致します。

<h2>sample</h1>

これは無効です。ネストされた構造を処理する場合、これは予期しない結果につながります(.*貪欲でありh[0-9]、入力HTML文字列の最後の終了タグまですべてに一致します)

を使用するかXMLDocument(HTMLはXMLではありませんが、これで十分です)、またはHtmlAgilityPackを使用できます。

于 2012-11-21T15:58:45.227 に答える
2

このコードを試してください:

String sourcestring = "<h2>content needs removing</h2> other content...";
String matchpattern = @"\s?<h[0-9]>[^<]+</h[0-9]>\s?";
String replacementpattern = @"";
MessageBox.Show(Regex.Replace(sourcestring,matchpattern,replacementpattern));

[^<]+.+が表示された場所で収集を停止するため、より安全です<

于 2012-11-21T16:01:17.687 に答える
1

これは私にとってはうまくいきます:

string myString = "<h2>content needs removing</h2> other content...";
Console.WriteLine(myString);
myString = Regex.Replace(myString, "<h[0-9]>.*</h[0-9]>", string.Empty);
Console.WriteLine(myString);

表示:

<h2>content needs removing</h2> other content...
other content...

予想通り。

実際のケースにいくつかの異なる見出しタグがあることが問題である場合は、貪欲な*数量詞に問題があります。可能な限り最長の一致を作成します。たとえば、次の場合:

<h2>content needs removing</h2> other content...<h3>some more headings</h3> and some other stuff

<h2>からまでのすべてを一致させ</h3>て置き換えます。これを修正するには、遅延数量詞を使用する必要があります。

myString = Regex.Replace(myString, "<h[0-9]>.*?</h[0-9]>", string.Empty);

あなたに残します:

other content... and some other stuff

ただし、これはネストされた<h>タグを修正しないことに注意してください。@fardjadが言ったように、HTMLに正規表現を使用することは一般的に良い考えではありません。

于 2012-11-21T15:56:59.987 に答える