C#で正規表現

このQ&Aのポイント
  • C#で正規表現を使用してHTML形式の文字列から情報を取得する方法について教えてください。
  • 現在はRegex.Replaceを使用して<>カッコに囲まれた部分を削除し、残りの文字列を解析していますが、<td></td>で囲まれた文字列を取得するように仕様変更したいです。
  • 具体的に分からなかった点は、(半角のダブルクォーテーション)の扱い・指定方法、<td></td>で囲まれた表現の具体的な書き方、<td></td>内に<font>などのさらに<>で囲まれた部分がある場合の対処方法です。
回答を見る
  • ベストアンサー

C#で正規表現

C#で、HTML形式で書かれた文字列から情報取得したいと思っています。 その際に使う文字列判別のための正規表現についてご助言ください。 現在、Regex.Replaceで、<>カッコに囲まれた部位は削除、残りの文字列を解析して情報取得しています。 これをHTMLのテーブル、つまり<td></td>※で囲まれた文字列を取得するよう仕様変更したいと思っています ※実際は<td width=・・・・>などとなります。 このサイトのページ最下部のC#ソースにありますような書き方をしようと思っています。 http://dobon.net/vb/dotnet/string/regexmatch.html 以上が、質問概要です。 私が正規表現を書いたとき分からなかった点は、 1.”(半角のダブルクォーテーション)の扱い・指定方法 2.<td></td>で囲まれた、というような表現の具体的な書き方 3.<td></td>内には<font>などのさらに<>で囲まれた部位が混入、その対処方法 参考までに、処理対象となるサイトはこちらになります。 http://www.traders.co.jp/stocks_data/data/brand_move/brand_move.asp 以上よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

この種の処理に正規表現(だけ)で処理を行おうとするのはあまりお勧めできません。 なぜなら、HTMLのような構造を持ったデータを処理するのには向いていないからです(できないというわけでもない)。 CodeZine:Microsoft C#でのHTML構文解析(.NET Framework, 構文解析, パーサ, HTML) http://codezine.jp/a/article/aid/145.aspx# のような手段を考えることをお勧めします。 まあ参考までに書いておきますが、 <td 属性>データ</td> というパターンなら、 <td[^>]*>(.*?)</td> で最初のグループに td の中身が取れます。 > 1.”(半角のダブルクォーテーション)の扱い・指定方法 これは \" でいけませんか?

mooboogie
質問者

お礼

すべてを見透かされたようで、少し恥ずかしい気分です。 というのは、実はそのサイトを見た後、「な、長い」と思い、苦手なくせに正規表現での抽出に逃げようとした経緯があったからです^^; 1.Perlスクリプトであると簡単にTD属性の情報が取得できるので、それを利用する 2.HTML構文解析ルーチンを設けて、それで対応する 3.教えていただいた正規表現でとりあえず運用する 3で運用しつつ、1での運用を準備し、2を勉強して将来に備える、 この流れで、sakusaker7さんのご助言を生かしたいと思います。 ありがとうございました。

関連するQ&A

  • 正規表現を教えてください。

    正規表現を教えてください。 C#で正規表現を用いた文字列検索を勉強中なのですが、うまくマッチさせることができません。教えていただけないでしょうか。 検索対象の文字列は下のようになります。 キーワード;値; 文字列中に該当するキーワードが存在する場合に、その値を取得するプログラムを考えています。しかし、私の正規表現では2つ目の「;」を検出してしまい、キーワードのみを取得することが出来ずに困っています。 見当違いの表記をしているとは思うのですがどなたかお助けください。 match = Regex.Match(line, "^(.*);"); C#初心者なものです。

  • 正規表現

    Java 5.1 java.util.regex.Pattern java.util.regex.Matcher を用いてHTMLのTABLEを抽出したいのですが、ヒットしません。正規表現のパターンはどうしたらいいのでしょう? パターン: < *table.*?>[\s.]*?< */table *?> 検索対象: … <table border=1 width=200> <tr><th>AA</th><th>BB</th></tr> <tr><td>CC</td><td>DD</td></tr> <tr><td>EE</td><td>FF</td></tr> </table> … で、TABLEタグを含むTABLE全体を期待したのですが全くヒットしませんでした。 ちなみに * <table …>と</table>単体ではヒットします。 * ソースから改行文字を取り除いて一行テキストとした場合にはヒットします。 これらのことから、改行文字がマッチしていないことが原因かと思うのですが、パターンの正規表現についてご教授願います。

    • ベストアンサー
    • Java
  • (C#)1バイトの正規表現

    下記のような正規表現による置換をほどこしました。 Buffer=Regex.Replace(Buffer,"^[\x00-\xff]{100}","",RegexOptions.Singleline); 文字列の先頭の100バイトを削除する正規表現ですが、うまく動作しません。 どうも文字コードに問題があるようなのですが、原因のわかる方いらっしゃいますか?

  • c#の正規表現がうまくいきません

    c#の正規表現がうまくいきません 以下のhtmlから指定の文字列を抜き取ります(htmlは適当です) ---------------------------------------- <select class="iiy_name_list"> <option value="1347">abc</option> </select></td> <select class="sug_name_list"> <option value="761">def</option> </select></td> ---------------------------------------- 2行目の"abc"、5行目の"def"の2つをキャプチャで得たいのですが、 @"<option\s+[^>]*>(.*)</select>",という指定では5行目の"def"しか得られません forを使って2回のループで一つ目の変数に"abc"二つ目の変数に"def"を入れるには どうしたらよいのでしょうか? 以下のページを参考にしたのですが、うまくいきません… http://uchukamen.com/Programming1/RegEx/index.htm よろしくお願いします。

  • c#で正規表現を使用してのmatchがうまくいきません。

    c#で正規表現を使用してのmatchがうまくいきません。 例えば以下のようなタグがあったとします この6行をmatchの対象の文字列としたとします。(タグは適当です) ---------------------------------------- <select class="iiy_name_list"> <option value="1347">abc</option> </select></td> <select class="sug_name_list"> <option value="761">def</option> </select></td> ---------------------------------------- 2行目の"abc"を含む列が欲しかったので、以下のように正規表現にてキャプチャ範囲を指定 @"<option\s+value=""1347"">(.*)</select></td>", しかし、”(.*)”以降に指定した"</select></td>"というタグは match対象の全体分には2箇所全く同じ物があるため、2回目に出現した"</select></td>"まで読み込み、不必要なdefの行までも取得してしまいます。 "</select></td>"以外に正規表現で指定できる文字はありません、 ”(.*)”以降に指定した"</select></td>"が最初に出現した場所までをキャプチャし、2回目に出現してもキャプチャの範囲対象外にするには どのようにすればよいのでしょうか? よろしくお願いします。

  • 正規表現で完全一致したキーワードのみ置換したい

    例えば、 SLEEP AND ASLEEPの文字列から SLEEPを検索し、.zZに変換したいと思います。 しかし、ASLEEPにはHITして欲しくありません。 正規表現でSLEEPだけマッチングさせるには、 どのような式を与えたら良いでしょうか? そのまま置換に使用したいので、 取得結果としては、オフセット(0,5)が取得できて欲しいです。 正規表現には、POSIXのregexを使用します。

  • 正規表現で数字をメタ文字に置換えると結果が異なる理由が分かりません。

    正規表現で数字をメタ文字に置換えると結果が異なる理由が分かりません。 現在、正規表現でチェックするコードがあります。 この正規表現中の数字「9」を「\d」に置換えました。  置換え前)  置換え後)   9([x]c+)*&  \d([x]c+)*& VisualStudio2008のC#にて実装し、文字列「9xc1&」で テストすると結果が異なりました。 (Regexクラスのオプションはデフォルトのまま) Regex.IsMatch("9xc1&", @"9([x]c+)*&") == false Regex.IsMatch("9xc1&", @"\d([x]c+)*&") == true 置換え前が正しいと思うのですが、メタ文字に置換えると グループやアスタリスクの影響を受けるのでしょうか? アドバイスをお願い致します。

  • VB.NETの正規表現の書き方を教えてください。

    下のような改行を含む文字列から、1や2を指定してデータ1、データ2を取得したいです。 決まった文字列(変更のない)はNAMEのみで、 取得したい文字列ですが、例えば2を指定した場合は 具体的には NAME=b12345 A=b12345 B=b98765 C=bXYZ このような内容を取得したいです。 -------------------------------------- abcde aiueokakikukeko ここに改行を含むいろな文字列がある場合とない場合があります。 asdfghj NAME=a12345 A=a12345 B=a98765 C=aXYZ ここに改行を含むいろな文字列がある場合とない場合があります。 NAME=b12345 A=b12345 B=b98765 C=bXYZ ここに改行を含むいろな文字列がある場合とない場合があります。 NAME=c12345 A=c12345 B=c98765 C=cXYZ ここに改行を含むいろな文字列がある場合とない場合があります。 -------------------------------------- 正規表現の部分は現在はこのように書いてあります。 Dim i As Integer = 2 Dim reg As Regex Dim m As Match Dim Target As String reg = New Regex("", RegexOptions.Compiled Or RegexOptions.Multiline) m = reg.Match(Data) If m.Success = True Then Target = reg.Match(Data).Result("${Target}") End If Console.WriteLine(Target) 数量の指定をすれば何とかなりそうだと思ったのですが、 試行錯誤しても思うように取り出すことが出来ず 申し訳ないのですが、適切な書き方をご教示頂ければ幸いです。

  • 正規表現 C#

    こりんご様、皆様 ご回答ありがとうございます。 でもまだ、私の理解力が足りず、応用が利かないのでまた質問させて下さい。 以下のページの176行目 http://my.chiebukuro.yahoo.co.jp/my/myspace_quedetail.php?writer=sescode7689 ↓この部分を正規表現で取得したいので "yj-guid" この様に書いて見ました。↓ Regex re = new Regex(@"<span class=(?<hiduke>.+?)>現在位置", RegexOptions.Singleline); でも取得できないのです。 どの辺りが違うのでしょうか? 教えて下さい。 応用力を付けたいです。 宜しくお願いします。

  • 正規表現にて質問があります。

    テスト勉強をやっていて過去問をみたら正規表現の部分だけわからずにいます (1)α=(0|10)*2(1|00|010)+ (2)α=(ab|c)*c(bc|a)+ (3)α=(1|22)*a(333|4444)* (1)正規表現αが表す文字列内、文字列長が1のものすべてを列挙せよ (2)正規表現αが表す文字列内、文字列長が2のものすべてを列挙せよ (3)正規表現αが表す文字列内、文字列長が3のものすべてを列挙せよ (4)正規表現αが表す文字列内、文字列長が4のものすべてを列挙せよ の答えを教えてもらえないでしょうか? もしよろしければどうやってとけばいいかのアドバイスもお願いします