htmlタグの属性を正規表現で抽出

タグの編集
投稿者 Regex  (高校生) 投稿日時 2012/2/21 17:54:47
初めて投稿します。

今VBでhtmlのエディタを作成しているのですが、RichTextboxでタグの色を変えるときに正規表現を使用しています。

そこで、ある程度の色付けは実装できるのですが、タグの中まで詳細に色付けすることが今の能力ではできません。

たとえば <input type="checkbox" checked="true" id="test"> とやった時に、「type=」、「checked=」、「id=」 を取り出して赤に色付けし、「"」から「"」までの範囲を緑で色づけしたいときはどのような正規表現を用いるとできますか?

今のところある程度の色付けに関しては


'カラーテーブルを削除するコード 
        Dim s As String, ss As String
        Dim t1 As Integer, t2 As Integer
        s = RithTextBox1.Rtf
        t1 = s.IndexOf("{\colortbl")
        If t1 > 0 Then
            t2 = s.IndexOf("}", t1)             'カラーテーブルが有った場合{の次の}を探す  
            ss = s.Substring(t1, t2 - t1 + 1)   '{から}までを切り出す 
            s = s.Replace(ss, "")               '{から}の文字を空白に置き換える 
        End If

        '\cf0:黒 \cf1:タグ内の色(青) \cf2:「<」と「>」(赤) \cf3:コメントタグの色(緑) 

        s = Replace(s, "\viewkind""{\colortbl ;\red255\green0\blue0;\red0\green0\blue255;\red0\green150\blue0;}" & vbCrLf & "\viewkind")
        s = Regex.Replace(s, "<(.*?)>""\cf2<\cf1$1\cf2>\cf0", RegexOptions.IgnoreCase)
        s = Regex.Replace(s, "<\\cf1!(.*?)\\cf2>""\cf3<!$1>\cf0", RegexOptions.IgnoreCase)
        RithTextBox1.Rtf = s


のような感じで、Rtfプロパティをいじって色を付けています。

このプログラムは http://www.geocities.jp/hatanero/richtext.html を参考に作っています。

正規表現とRtfに詳しい方、回答お願いします。
投稿者 shu  (社会人) 投稿日時 2012/2/23 17:34:48
rtf構文は調べてないのでイメージだけですが以下のような感じで出来ると思います。

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim reg As New Regex("<(?<tagName>.+?)( (?<attrName>.+?)=(?<attrValue>.+?))*>")

        TextBox2.Text = reg.Replace(TextBox1.Text, AddressOf MatchEval)
    End Sub

    Private Function MatchEval(m As Match) As String
        Dim strRet As New System.Text.StringBuilder

        strRet.Append("<")
        strRet.Append(m.Groups("tagName").Value)

        Dim capAttrName = m.Groups("attrName").Captures()
        Dim capAttrValue = m.Groups("attrValue").Captures()
        Dim intIdx = 0

        Do While intIdx < capAttrName.Count
            strRet.Append(" ")
            strRet.AppendFormat("[blue:{0}]", capAttrName(intIdx).Value)
            strRet.Append("=")
            strRet.AppendFormat("[red:{0}]", capAttrValue(intIdx).Value)
            intIdx += 1
        Loop

        strRet.Append(">")

        Return strRet.ToString
    End Function