投稿者 shu  (社会人) 投稿日時 2011/2/17 00:38:14
これでだいぶましになったと思う。まだ抜けはあると思います。
TextBox1:入力
TextBox2:出力
にしてあります。

        Dim reg2 As New Regex("^(?<PRE>[^""]*"")(?<AFT>.*)$", RegexOptions.Compiled)
        Dim reg3 As New Regex("^(?<PRE>[^/]*)/(?<C2>[/*])(?<AFT>.*)$", RegexOptions.Compiled)
        Dim reg4 As New Regex("^(?<PRE>[^*]*)\*/(?<AFT>.*)$", RegexOptions.Compiled)
        Dim reg5 As New Regex("(?<PRE>(^.*?[^\\]|^)"")(?<AFT>.*)$", RegexOptions.Compiled)
        Dim rd As New StringReader(TextBox1.Text)
        Dim wt As New StringBuilder
        Dim blnCom = False
        Dim blnStr = False
        Dim m As Match

        Dim strLine = rd.ReadLine
        Do While strLine IsNot Nothing
            Do While strLine.Length > 0
                '--- コメント中
                If blnCom Then
                    m = reg4.Match(strLine)
                    If m.Success Then
                        blnCom = False
                        strLine = m.Groups("AFT").Value
                    Else
                        strLine = String.Empty
                    End If
                    Continue Do
                End If
                '--- 文字列中
                If blnStr Then
                    m = reg5.Match(strLine)
                    If m.Success Then
                        blnStr = False
                        wt.Append(m.Groups("PRE").Value)
                        strLine = m.Groups("AFT").Value
                        If strLine.Length = 0 Then
                            wt.AppendLine()
                        End If
                    Else
                        wt.AppendLine(strLine)
                        strLine = String.Empty
                    End If
                    Continue Do
                End If
                '--- 文字列の開始検知
                m = reg2.Match(strLine)
                If m.Success Then
                    blnStr = True
                    wt.Append(m.Groups("PRE").Value)
                    strLine = m.Groups("AFT").Value
                    If strLine.Length = 0 Then
                        wt.AppendLine()
                    End If
                    Continue Do
                End If
                '--- コメントの開始検知
                m = reg3.Match(strLine)
                If m.Success Then
                    wt.Append(m.Groups("PRE").Value)
                    Dim strC2 = m.Groups("C2").Value
                    If strC2 = "/" Then
                        strLine = String.Empty
                        wt.AppendLine()
                        Continue Do
                    Else
                        blnCom = True
                        strLine = m.Groups("AFT").Value
                        If strLine.Length = 0 Then
                            wt.AppendLine()
                        End If
                        Continue Do
                    End If
                End If
                '--- 通常行
                wt.AppendLine(strLine)
                strLine = String.Empty
            Loop
            strLine = rd.ReadLine
        Loop

        TextBox2.Text = wt.ToString
        rd.Close()
        rd.Dispose()