Ruby で書いた「リスト文字列を1文字ずつパース」をVBで書きました。
これは実際に仕事に使おうと思うのだけれども、本物のリストでやった方がこの先面白そうです。
Imports System Imports System.Collections.Generic Public Class ListString Private str As String = "" Sub New(ByVal Name As String) Me.str = Name End Sub Public Property Name() As String Get Return str End Get Set(ByVal value As String) str = value End Set End Property Public Function Head() Return str.Substring(0, 1) End Function Public Function Tail() Return str.Substring(1) End Function Public Function Length() Return str.Length End Function End Class Public Class ListObject Private Lstr As New List(Of Object) Sub New() Me.Lstr = New List(Of Object) Lstr.Add(Nothing) End Sub Public Function Head() Return Lstr(0) End Function Public Function Last() Return Lstr(Lstr.Count - 2) End Function Public Function Last2() Return Lstr(Lstr.Count) End Function Public Sub Clear() Lstr.Clear() Lstr.Add(Nothing) End Sub Public Function Tail() Dim Tarray() As Object = New Object(Lstr.Count) {} Dim i As Object Dim TailList As New ListObject Lstr.CopyTo(1, Tarray, 0, Lstr.Count - 1) TailList.Clear() For Each i In Tarray TailList.Push(i) Next i Return TailList End Function Public Sub Push(ByRef value As Object) Lstr(Lstr.Count - 1) = value Lstr.Add(Nothing) End Sub Public Sub Pop() If Lstr.Count > 1 Then Lstr.Remove(Nothing) Lstr(Lstr.Count - 1) = Nothing End If End Sub Public Function Show() Return "{" + AllList(Me) + "}" End Function Private Function AllList(ByRef list As ListObject) If IsNothing(list.Head) Then Return "" Else Return Tostr(list.Head()) + sPace(list.Tail) + AllList(list.Tail) End If End Function Private Function IsNothing(ByRef cell As Object) If TypeOf cell Is ListObject Then Return False Else If cell = Nothing Then Return True Else Return False End If End If End Function Private Function Tostr(ByRef cell As Object) If TypeOf cell Is ListObject Then Return cell.Show Else If TypeOf cell Is String Then Return """" + cell + """" Else Return cell.ToString End If End If End Function Private Function sPace(ByRef list As ListObject) If IsNothing(list.Head) Then Return "" Else Return "," End If End Function End Class Module Module1 Function StringToList(ByVal inString As ListString, ByRef out As ListObject, _ ByVal Str As String, ByVal flag As Boolean) If inString.Length = 1 Then Return out.Head Else Dim head As String = inString.Head Dim tail As ListString = New ListString(inString.Tail) If head = "[" Then Dim ls As New ListObject out.Push(ls) Return StringToList(tail, out, Str, flag) ElseIf head = "]" Then Dim last As ListObject = out.Last out.Pop() Dim last2 As ListObject = out.Last out.Pop() last2.Push(last) out.Push(last2) Return StringToList(tail, out, Str, flag) ElseIf head = "," Then Return StringToList(tail, out, Str, flag) ElseIf head = """" Then If flag Then Dim ls As New ListObject ls = out.Last ls.Push(Str) out.Pop() out.Push(ls) Return StringToList(tail, out, "", False) Else Return StringToList(tail, out, Str, True) End If Else Return StringToList(tail, out, (Str + head), True) End If End If End Function Function StrToList(ByVal inString As ListString) Dim EmptyList As New ListObject Return StringToList(inString, EmptyList, "", False) End Function Sub Main() Dim r As New ListObject Dim Lstr As ListString = New ListString("[[""A"",[""B""]],[[[""C""],""D""],""1""]]") r = StrToList(Lstr) System.Console.WriteLine(r.Show) '=> {{"A",{"B"}},{{{"C"},"D"},"1"}} System.Console.WriteLine(r.Head.Show) '=> {"A",{"B"}} System.Console.WriteLine(r.Tail.Show) '=> {{{{"C"},"D"},"1"}} End Sub End Module