3

不適切な形式の html があり、" が欠落している場合があります。また、大文字が表示されることもあれば、小文字が表示されることもあります。

<DIV class="main">
    <DIV class="subsection1">
   <H2>
   <DIV class=subwithoutquote>StackOverflow</DIV></H2></DIV></DIV>

複数行と大文字と小文字を無視して両方を一致させたいと思います。しかし、次のパターンは機能していないようです。(連結については、&の代わりに|も試しました)

const string pattern = @"<div class=""?main""?><div class=""?subsection1""?><h2><div class=""?subwithoutquote""?>(.+?)</div>";
Match m = Regex.Match(html, pattern, RegexOptions.IgnoreCase & RegexOptions.Singleline);

または、複数行の問題を解決するためにパターンに \n* を追加する必要がありますか?

4

2 に答える 2

7

最初の問題は、タブ間の正規表現に空白を使用できないことです。正しい正規表現(Rubularでテスト済み)は次のとおりです。

<div class=""?main""?>\s*<div class=""?subsection1""?>\s*<h2>\s*<div class=\"?subwithoutquote\"?>(.+?)<\/div>\s*

\s*いくつかのエントリが追加されていることに注意してください。

2番目の問題は、オプションを適切に連結していないことです。

あなたのコード:

Match m = Regex.Match(html, pattern, RegexOptions.IgnoreCase & RegexOptions.Singleline);

これらはビットフラグであるため、Bitwise-And(&演算子)は間違ったフラグです。必要なのはBitwise-Or(|演算子)です。

Bitwise-Andは、「ビットがこれらの両方に設定されている場合は、設定したままにします。それ以外の場合は、設定を解除します。Bitwise-Orが必要です。つまり、ビットがこれらのいずれかに設定されている場合は、設定します。それ以外の場合は、設定を解除してください。」

于 2013-01-30T18:51:20.440 に答える
3

この場合、それらを一緒にORする必要があります。

const string pattern = @"<div class=""?main""?><div class=""?subsection1""?><h2><div class=""?subwithoutquote""?>(.+?)</div>";
Match m = Regex.Match(html, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline)

編集:RegExを次のように変更します...

const string pattern = @"<div class="?main"?>\s*<div class="?subsection1"?>\*+<h2>\s*<div class="?subwithoutquote"?>(.+?)</div>
于 2013-01-30T18:52:11.673 に答える