2016-08-09 16 views
-1

これはいくつかの容量で尋ねられたことは分かっていますが、解決策の実際の例はまだわかりませんでした。私は、Html Agility PackがHTML文字列を解析することを知っていますが、ダウンロード/インストールしたくありません。私は、たとえばなど、C#間にワイルドカード文字列を使用して2つの文字列の間の文字列を取得する正規表現ですか?

string html = client.DownloadString("http://yoursite.com/page.html"); 

を使用して、ウェブページの内容は、私は彼らと一緒にクラスを持つタグを持っているが、これらのタグのいくつかはまた、独自のID、またはスタイルを持ってもらう:

<td>I Dont want this</td> 
<td class="myClass">I want this</td> 
<td class="myClass" id="myID">I want this</td> 
<td style="border-top-width: 0px; class="myClass">I want this</td> 

私はを試してみました

など、ID、私は

<td>(.*?)</td> 

をしようとしたが、それは、任意のクラスなしのタグを返します。

<td class="myClass"[^>]*>(.*?)</td> 
ただし、2番目と3番目の <td>の値だけが返されますが、4番目の値は返されません。どのように <td>myClassと返すワイルドカードを追加できますか? idまたは styleの前後にあるものは無視しますか?

+1

私はあなたに[このかなり有名な質問]を指摘するように強制される(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – Jonesopolis

+0

HTMLの一部は常に質問で指定されている形式と同じ形式になります。ブラウザが自動的に自動補完し、自動修正するためのエラーや過負荷はありません。 – KingsInnerSoul

+0

'class'属性の前に別の' [^>] * 'を追加するだけです。あなたのHTMLがあなたの言うとおりに一貫しているならば、十分であるはずです。 –

答えて

0

これは、<tdにclass属性またはid属性があるかどうかだけを示します。
いずれかがある場合は合格です。

あなたが唯一のクラス値とidがオプションである必要がある場合は、(?(class)|(?!))

に条件付き
を変更することが開始タグを見つけた後、この方法は、ただの非常に次の閉鎖を見つけます。
(それが可能なら開口部<tdは、自己完結型のタグであれば、それはチェックしないことを注意。
、右の原子団
すなわち(後(?<!/>)を追加する?> ..)(?<!/>)

クラスid値は名前付きキャプチャグループに含まれています。

逐語

@"(?is)<td(?=\s)(?>(?:(?<=\s)class\s*=\s*""(?<class>[^""]*)""|(?<=\s)id\s*=\s*""(?<id>[^""]*)""|"".*?""|'.*?'|[^>]*?)+>)(?(class)|(?(id)|(?!))).*?</td\s*>"

(?is) 
< td     # 'td' tag, or any tag for that matter 
(?= \s) 
(?>     # Atomic grouping 
     (?: 
      (?<= \s) 
      class \s* = \s*  # 'class' attribute 
      " 
      (?<class>    # 'class' value              
       [^"]*     
      ) 
      " 
     | (?<= \s) 
      id \s* = \s*   # 'id' attribute 
      " 
      (?<id>     # 'id' value              
       [^"]* 
      ) 
      " 
     | " .*? " 
     | ' .*? ' 
     | [^>]*? 
    )+ 
     > 
) 
(?(class)    # Conditional - Only tags with our 'class' or 'id' attr/value 
    | 
     (?(id) 
     | (?!) 
    ) 
) 
.*? 
</td \s* > 

を拡張はところで、あなたの最後の行に<td style="border-top-width: 0px; class="myClass">I want this</td>
スタイル値が一部
=クラスを囲みます0それを行う必要がありますstyle="border-top-width: 0px; class="

0

<td(.+|)(class="myClass")(.+|)>(.+)<\/td>

ライブ例:https://regex101.com/r/gG6gH0/2

しかし、リストは任意の異なるフォーマットであるならば、あなたは、あなたがから「<」、「>」文字を除外する必要があります説明キャプチャグループ

関連する問題