文字列を要素に分解するには?

解決


トータ  2008-05-12 12:53:08  No: 139692  IP: 192.*.*.*

文字列を区切り文字(" "と",")で分解して要素を取り出す関数を作っているのですが、うまくいかず悩んでいます。

例えば、下の4つのパターンで、4つとも
「aaa」「bbb」「ccc」に分解できるようにしたいのですが。
"aaa bbb,ccc"
"aaa bbb ccc "
"  ,aaa bbb  ccc"
"  ,aaa bbb, , ccc"

ご教授のほどよろしくお願い致します。

編集 削除
やじゅ  2008-05-12 13:10:35  No: 139693  IP: 192.*.*.*

1. " ," → ","
2. ",," → ","
3. " " → ","
と3段階に置換してから、","でSplit関数とか
カンマ2つを1つにしていいかとか仕様的に問題あるかも

それか記号かa-zかどうかで判断可能かもね。

編集 削除
 2008-05-12 16:03:22  No: 139694  IP: 192.*.*.*

私もデータ仕様的にどうかと思う部分はあるが…例えば以下のようなやり方で どうか?
※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で取ってから、いらんのを排除するのもアリかもだけど)

編集 削除
 2008-05-12 16:05:29  No: 139695  IP: 192.*.*.*

あ、忘れてた。
上のはVB6で書いたけど、.NETだったら適当に書き換えてね。

編集 削除
トータ  2008-05-12 20:52:28  No: 139696  IP: 192.*.*.*

皆様、ありがとうございます。

まず一旦、区切り文字を1つの種類にしてから文字列を抽出する、というのは思いつきませんでした。

「あ」さん。
わざわざ詳しい注釈まで付いたプログラムを書いて下さってありがとうございます。
文字列の位置情報も欲しかったので、この方法でいかせてもらおと思います。

また困った時はよろしくお願いします。ありがとうございました。

編集 削除