VS2005 VBで以下の文字列からから「http://www.ews.com/xx/voa/ish/nnow/NNOW_HEADLINES.xxx」を抜き出して変数にセットしたいのですが、どのようにすればいいでしょうか?

なお、.xxxのみが決めうちで、それからhttpのhまでを切り出したいと思っています。httpやhrefなどのhtmlはどは検索する文字内にたくさんありますのではやり.xxxを検索、それからhまでを切り出すことになります。

xxx.................................
<a href="http://www.ews.com/xxx/vba/lish/now/NNOW_HEADLINES.xxx"
..................................xxxxxx

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/12/25 22:10:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:HALSPECIAL No.1

回答回数407ベストアンサー獲得回数86

ポイント35pt

こちらでいかがでしょうか

Imports System.Text.RegularExpressions

Dim strData = "<html>---------xxxxxxxxxxxx---------</html>"
Dim pattern As String = "<a href=""(.+?\.xxx)"""
Dim re As Regex = New Regex(pattern, RegexOptions.IgnoreCase Or RegexOptions.Singleline)

Dim m As Match = re.Match(strData)
While m.Success
    Debug.Print(m.Groups(1).Value)
    Exit While
End While
id:tama-jp No.2

回答回数36ベストアンサー獲得回数11

ポイント35pt

タグ以外に入っているURIも抽出したいのでしょうか。

それを見込んでするなら、正規表現までするようなものではないと考えますので、

URIの始まるところから終わるところまでをとるということでしたら

「://」〜「.xxx」を抽出し、「://」の前は、「 」(スペース)「"」で

区切られた後までのところを出すといいのでは?

以下、ソースはこちら、

Imports System
Imports System.Net
Imports System.IO
Imports System.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strArray() As String
        Dim strTemp As String
        strArray = getURL(TextBox1.Text)

        Debug.Print("------------------------")
        For Each strTemp In strArray
            Debug.Print(strTemp)
        Next
    End Sub

    Public Function getURL(ByVal strURL As String) As String()
        Dim retText As String = ""
        Dim delimiter As String = "://"
        Dim delimiter2 As String = ".css"
        Dim strTemp As String = ""
        Dim strTemp2 As String = ""

        Dim cnt, cnt2 As Integer
        Dim parts, parts2 As String()

        Dim targetString As String = getURLStream(strURL)

        '://で分けて配列化する。
        parts = Split(targetString, delimiter, -1, CompareMethod.Binary)

        For cnt = 1 To parts.Length - 1
            '.cssで分けて配列化する。
            parts2 = Split(parts(cnt), delimiter2, -1, CompareMethod.Binary)
            '.css以降がデータがあれば、「.css」が存在するということになる
            If parts2.Length > 1 Then
                strTemp = parts(cnt - 1)

                '://より前の文字列を調べる
                For cnt2 = strTemp.Length - 1 To 0 Step -1
                    strTemp2 = strTemp.Substring(cnt2, 1)
                    If strTemp2 = " " Or strTemp2 = """" Or strTemp2 = " " Then
                        'スペースや”が入っていたところから://までのところを抽出し結合
                        retText = retText & strTemp.Substring(cnt2 + 1, strTemp.Length - cnt2 - 1) & "://" & parts2(0) & delimiter2 & vbCr
                        Exit For
                    End If
                Next
            End If
        Next

        Return retText.Split(vbCr)

    End Function

    'URLを文字列として拾ってくる
    Private Function getURLStream(ByVal strURL As String) As String
        Dim ret As String = ""
        Dim myUri As New Uri(strURL)
        Dim myHttpWebRequest As HttpWebRequest = WebRequest.Create(myUri)
        Dim myHttpWebResponse As HttpWebResponse = myHttpWebRequest.GetResponse()
        If (myHttpWebResponse.StatusCode = HttpStatusCode.OK) Then
            Dim receiveStream As Stream = myHttpWebResponse.GetResponseStream()
            Dim readStream As New StreamReader(receiveStream, Encoding.GetEncoding("shift-jis"))
            ret = readStream.ReadToEnd()
            readStream.Close()
            myHttpWebResponse.Close()
        End If

        Return ret
    End Function
End Class

  • id:kn1967
    正規表現で抜き出すとか、InStrで探してMidで抜き出すとか・・・

    不適切な回答者だから、答えられないけど、ヒントにでもなれば・・・。
    http://q.hatena.ne.jp/1261132248
  • id:mai_mai_mail
    ヒントありがとうございます。instrでは末尾は検索できてもそこから先頭の文字列の長さが計れないので私ではできませんでした。
  • id:tama-jp
    質問の情報が足りないのと誤字脱字が多いようでわかりにくいんですが、
    簡単に言うとURIを抜き出したいのでしょうか。
    https://やhttp://などのURIから抜き出したいのでしょうか?
    ftp://やmailto://、telnet://とかもでしょうか?
  • id:kn1967
    InStrで上手くできないって事は、
    「.xxxを含んでいるリンクと含んでないリンクがある」からでしょ。

    動作コストが問題になるなら、
    InStr で .xxx を探して、そこから InStrRev で httpまで戻る方が、
    早いかもしれんから、コメントには入れたけど、所詮はVBって事で、
    単純に正規表現が楽だとは思うね。既に回答あるし、ここまでじゃないかな。

    一応 InStrRev は下記。
    http://msdn.microsoft.com/ja-jp/library/t2ekk41a(VS.80).aspx

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません