文字列の括弧をなんやかんやする
背景
練習がてら、文字列の括弧をなんやかんやするやつを作った。
ちょっと他所で使いそうなのでVBAで作った。
コード
Function Scan(St As String, h As Integer) As Variant() '#################################################### '引数 'String:パーサ対象文字(250くらいまで) 'h :最大階層数 '返却値 'variant():二次元配列で(string, integer) '例:(hoge(foo(piyo))hoge, 1) → (hoge,0) , (foo(piyo),1), (hoge,0) '################################q################### 'かっこがない時はそのまま返しておしまい If InStr(1, St, "(") = 0 And InStr(1, St, ")") = 0 Then Dim Arr_R2(1, 0) As Variant Arr_R2(0, 0) = St Arr_R2(1, 0) = 0 Scan = Arr_R2 Exit Function End If Dim i As Integer Dim buf_St As String: buf_St = "" 'キャッシュ Dim Buf_arr() As String '保存用 ReDim Buf_arr(1, Len(St) - 1) '(0, n):開始文字、(1, n);それまでの階層 '動的に要素数を決めるべきなんだろうけど面倒になった Dim buf As String '参照文字列 Dim q As Integer: q = 0 'ポインタ Dim hn As Integer: hn = 0 '階層 For i = 1 To Len(St) buf = Mid(St, i, 1) If buf = "(" Then If hn < h And Len(buf_St) > 0 Then 'hn => h の時はstackされない '各階層でつなげる必要はないのでpopもしちゃう Buf_arr(0, q) = buf_St Buf_arr(1, q) = hn buf_St = "": q = q + 1 End If hn = hn + 1 ElseIf buf = ")" Then If hn <= h And Len(buf_St) > 0 Then Buf_arr(0, q) = buf_St Buf_arr(1, q) = hn buf_St = "": q = q + 1 End If hn = hn - 1 End If '判定するの面倒だから手癖でやった If (hn > h Or Not buf = "(") And (hn >= h Or Not buf = ")") Then buf_St = buf_St & buf Next i 'キャッシュ掃き出し Buf_arr(0, q) = buf_St Buf_arr(1, q) = 0 '値が入っている要素の最大値を取る q = 0 Do While Len(Buf_arr(0, q)) > 0 q = q + 1 Loop '返却用 Dim Arr_R() As Variant ReDim Arr_R(1, q - 1) For i = 0 To q - 1 Arr_R(0, i) = Buf_arr(0, i) Arr_R(1, i) = Val(Buf_arr(1, i)) Next Scan = Arr_R End Function