• 締切済み

VB2005の正規表現について

文字列の中から特定の文字列を抜き出そうとしています。 例) <TD align=left noWrap bgcolor=#ffffff rowspan=2>AAA</TD> 例の文字列の中からAAAだけを抜き出すにはどのような正規表現を 用いたらよいでしょうか。 御教授下さい。 開発環境:Visual Basic 2005 Express Edition

みんなの回答

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

vbはよくわからんので、コレクションとか使えばもっとすっきりできるでしょうけど こんなんですか imports System imports System.Text.RegularExpressions Imports Microsoft.VisualBasic Module OKWave public sub Main () dim rx as Regex = new Regex("<TD[^>]*>(.*?)</TD>", _ RegexOptions.Compiled Or RegexOptions.IgnoreCase) dim text as string = "<TD align=left noWrap bgcolor=#ffffff rowspan=2>AAA</TD>" & vbCrLf & _ "<TD align=left noWrap bgcolor=#ffffff rowspan=1>BBB</TD>" & vbCrLf & _ "<TD align=left noWrap bgcolor=#ffffff rowspan=1>CCC</TD>" & vbCrLf dim matches as MatchCollection = rx.Matches(text) Console.WriteLine("{0} matches found.", matches.Count) dim maxindex as integer = matches.count dim elements(maxindex-1) as string dim m as Match dim i as integer = 0 for each m in matches dim word as string = m.Groups(1).Value 'Console.WriteLine("{0}", word) elements(i) = word i = i+1 next dim result as string result = join(elements, ", ") Console.WriteLine("result = {0}", result) end sub End Module 3 matches found. result = AAA, BBB, CCC

yasu-jda
質問者

お礼

回答ありがとうございます。 ソースを利用して希望の結果が得られました。 何度もありがとうございます。

yasu-jda
質問者

補足

ここからさらに応用で得られる結果を複数行に表示することはできますでしょうか。 例 <TD align=left noWrap bgcolor=#ffffff rowspan=2>AAA</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=1>BBB</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=1>CCC</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=2>DDD</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=1>EEE</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=1>FFF</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=2>GGG</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=1>HHH</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=1>III</TD> result=AAA,BBB,CCC,DDD,EEE,FFF,GGG,HHH,III ↓ result1=AAA,BBB,CCC result2=DDD,EEE,FFF result3=GGG,HHH,III

  • hotosys
  • ベストアンサー率67% (97/143)
回答No.4

目的が >文字列の中から特定の文字列を抜き出そうとしています。 で >どのような正規表現を用いたらよいでしょうか。 が絶対条件でなければ Private Sub sample() Dim wb As New WebBrowser wb.Navigate("http://blog.goo.ne.jp/") Do While wb.ReadyState <> WebBrowserReadyState.Complete Application.DoEvents() Loop For i As Integer = 0 To wb.Document.GetElementsByTagName("table").Item(0).GetElementsByTagName("td").Count - 1 MsgBox(wb.Document.GetElementsByTagName("table").Item(0).GetElementsByTagName("td").Item(i).InnerText) Next End Sub みたいにdom(というのか)htmlやxmlを解析する機能を持つオブジェクト使うと楽ですよ。 入れ子のtable(tableの中にtableがある)みたいのがあると正規表現で調べるの大変ですよ。 p.s. あまり詳しくないのでいい加減なサンプルです。 それにテーブルが無い場合のエラーチェックもしてないし・・・

yasu-jda
質問者

お礼

回答ありがとうございます。 DOM関数を知りませんでしたので勉強になりました。 今回VBでWebを扱わないので使えるかどうかわかりませんが 非常に参考になりました。 hotosysさんありがとうございます。

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

TDタグの中でも拾いたいものと拾いたくないものがあるということでしょうか? もしそうなら条件を絞り込む記述を加えないといけません。 ><TD[^>]*>(.*?)</TD>を参考にしたところ希望の文字列の他に >別のTDタグの文字列が表示されました。 どういう文字列に対して行ったんでしょうか? #1の方の回答にあるような .* であれば複数のTDタグ(とその閉じタグのペア)を拾う可能性がありますが、 こちらは .*? としているので閉じタグをさらに超えることはないはずなんですが。 中身は適当でかまわないので、どういうパターンのデータがくるのか例を出してもらえますか?

yasu-jda
質問者

お礼

sakusaker7さん、回答ありがとうございます。 >こちらは .*? としているので閉じタグをさらに超えることはないはずなんですが。 私の勘違いでした。 For文で結果の表示を繰り返していたので複数表示されていただけでした。 申し訳ありません。 >TDタグの中でも拾いたいものと拾いたくないものがあるということでしょうか? はい、その通りです。 アドバイスをヒントに<TD[^>]*(条件)>(.*?)</TD>としてみたところ、希望の文字列が拾えました。 ありがとうございました。 さらに質問なんですが、複数行のTDタグのTDタグにはさまれている文字列を拾い、 1つの行に表示するにはどうしたらよいでしょうか。 例) <TD align=left noWrap bgcolor=#ffffff rowspan=2>AAA</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=1>BBB</TD> <TD align=left noWrap bgcolor=#ffffff rowspan=1>CCC</TD>  ↓ AAA,BBB,CCC お手数ですが御教授願えますでしょうか。 よろしくお願いします。

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

提示されている前提条件が少ないのでなんともいえないですね。 TDタグの属性は質問にあるものだけなんですか? また、AAAは固定の文字列じゃないんですよね? TDタグに囲まれているAAAということなら <TD[^>]*>([^<]*)</TD> な感じで取れます。 <TD[^>]*>(.*?)</TD> でもいいですけど。

yasu-jda
質問者

お礼

回答ありがとうございます。

yasu-jda
質問者

補足

>TDタグの属性は質問にあるものだけなんですか? いえ、他の属性もあります。 TDタグで属性が違うものが複数行あります。 >また、AAAは固定の文字列じゃないんですよね? 固定の文字列ではありません。 <TD[^>]*>(.*?)</TD>を参考にしたところ希望の文字列の他に 別のTDタグの文字列が表示されました。 私は最終的に、複数行のTDタグに囲まれたそれぞれの文字列を カンマで区切って表示したいと考えています。 最初に提示した前提条件が少なすぎて申し訳ありませんでした。

  • mo_gu
  • ベストアンサー率51% (56/109)
回答No.1

<TD align=left noWrap bgcolor=#ffffff rowspan=2>(.*)</TD> こんな感じかな

yasu-jda
質問者

お礼

回答ありがとうございます。

関連するQ&A

専門家に質問してみよう