文字列を区切り文字(" "と",")で分解して要素を取り出す関数を作っているのですが、うまくいかず悩んでいます。
例えば、下の4つのパターンで、4つとも
「aaa」「bbb」「ccc」に分解できるようにしたいのですが。
"aaa bbb,ccc"
"aaa bbb ccc "
" ,aaa bbb ccc"
" ,aaa bbb, , ccc"
ご教授のほどよろしくお願い致します。
1. " ," → ","
2. ",," → ","
3. " " → ","
と3段階に置換してから、","でSplit関数とか
カンマ2つを1つにしていいかとか仕様的に問題あるかも
それか記号かa-zかどうかで判断可能かもね。
私もデータ仕様的にどうかと思う部分はあるが…例えば以下のようなやり方で どうか?
※Form1に、Text1、Command1、List1を貼り付け、Text1に元の文字列を入れてCommand1でListに要素が入る
Private Sub Command1_Click()
Dim tmpStr As String '文字列Work
Dim tmpElem As String '要素Work
Dim pos As Integer '処理Position
Dim prevPos As Integer '前回のPosition
Dim svLen As Integer '文字の初期長(今回の置換処理では長さは変わらないが、一応)
List1.Clear
tmpStr = Text1
svLen = Len(tmpStr)
For pos = 1 To svLen
'ひとまずSpaceはカンマに
If Mid(tmpStr, pos, 1) = " " Then
Mid(tmpStr, pos, 1) = ","
End If
'
Next
'カンマ位置初期化
prevPos = 0
Do
'前回のカンマ位置+1から、カンマ検索
pos = InStr(prevPos + 1, tmpStr, ",")
'見つからなければ、最後尾に文字が残っていれば出力して、終了
If pos = 0 Then
If prevPos < Len(tmpStr) Then
List1.AddItem Mid(tmpStr, prevPos + 1)
End If
Exit Sub
End If
'見つかった場合…要素切り出し
tmpElem = Mid(tmpStr, prevPos + 1, pos - 1 - prevPos)
'長さゼロでなければ出力
If tmpElem <> "" Then
List1.AddItem tmpElem
End If
'今回のカンマ位置を前回のカンマ位置として記憶
prevPos = pos
Loop While pos < Len(tmpStr)
End Sub
たぶんいけるはず。
ステップ実行でもやってみて、動作を理解するよう。
特殊パターンなんでSplit関数は使ってないので、了承くだされ。
(ひとまずSplitで取ってから、いらんのを排除するのもアリかもだけど)
あ、忘れてた。
上のはVB6で書いたけど、.NETだったら適当に書き換えてね。
皆様、ありがとうございます。
まず一旦、区切り文字を1つの種類にしてから文字列を抽出する、というのは思いつきませんでした。
「あ」さん。
わざわざ詳しい注釈まで付いたプログラムを書いて下さってありがとうございます。
文字列の位置情報も欲しかったので、この方法でいかせてもらおと思います。
また困った時はよろしくお願いします。ありがとうございました。