スピリット関数でデータを分割する際に文字数限定で

解決


トシ  2008-10-21 14:51:34  No: 145320  IP: 192.*.*.*

VB2008で開発しております、
戸惑ってしまい投稿しました、お世話になります 。
スピリット関数でデータを分割する際に文字数限定で
抜き取ることは可能でしょうか。
"#"一文字限定で抜き出したいのですが、"##"や"###"はデータ
としみなします、なんとかスピリット関数で解決したいと思います
よろしくお願いします。

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim dt() As String
        Dim data As String
        data = "TEST1#TEST2#TES##T3#TEST4"
        dt = Strings.Split(data, "#")
        For Each s As String In dt
            Console.WriteLine(s)
        Next
        '上記実行結果
        'TEST1
        'TEST2
        'TES
        '
        'T3
        'TEST4

        '改善後の結果
        'TEST1
        'TEST2
        'TES##T3
        'TEST4
    End Sub

編集 削除
YuO  2008-10-21 16:12:36  No: 145321  IP: 192.*.*.*

Split関数ではどうしようもないです。
正規表現を工夫して,Regex.Split使うのが一番早いかと思います。

編集 削除
特攻隊長まるるう  2008-10-21 17:16:04  No: 145322  IP: 192.*.*.*

どうでもいいけど気になること。
・スピリット  spirit:心,精神
・スプリット  split :分割[分離]する
。。。ボーリングとかしないのかな?

編集 削除
トシ  2008-10-21 18:02:39  No: 145323  IP: 192.*.*.*

Regex.Splitを使い同じ事が出来たのですが正規表現が
難しいです、"#"はOK "##"と"###"はNG  いろいろ調べました
が...分かりません、ご教授お願いします。

Imports System.Text.RegularExpressions

        Dim dt() As String
        Dim data As String
        data = "TEST1#TEST2#TES##T3#TEST4"
        Dim dm As New Regex("#")
        dt = dm.Split(data)
        For Each s As String In dt
            Console.WriteLine(s)
        Next

編集 削除
やじゅ  2008-10-21 18:47:14  No: 145324  IP: 192.*.*.*

"##"や"###"は一度、"@"などの特定の文字に変換してから
スプリットして、特定の文字を元に戻す。

特定の文字は、含まれない文字にする必要がありますけどね。

編集 削除
我龍院  2008-10-21 19:23:48  No: 145325  IP: 192.*.*.*

Dim strData As String = "TEST1#TEST2#TESE######T3#TEST4"
        strData = strData.Replace("##", Chr(2))
        strData = strData.Replace(Chr(2) + "#", Chr(3))
        Dim str() As String = strData.Split("#")
        For i As Integer = 0 To str.Length - 1
            str(i) = str(i).Replace(Chr(3), Chr(2) + "#")
            str(i) = str(i).Replace(Chr(2), "##")
            ListBox1.Items.Add(str(i))
        Next
こんな手もあるが、トリッキーだから、私なら頭から処理してくかな。

編集 削除
YuO  2008-10-21 20:27:15  No: 145326  IP: 192.*.*.*

正規表現でちゃんと表現可能です。

先読みと後読みを使います。
(?<!#)#(?!#)
前に#がなく,後ろに#がない#で分割します。

編集 削除
トシ  2008-10-22 08:52:19  No: 145327  IP: 192.*.*.*

いろいろと、ご回答ありがとうございます。

YuOさんの正規表現素晴らしいです"#"が何個
連続で入っていても問題なしですね(笑)

プログラムに取り込み解決しました
ありがとうございます。

編集 削除
トシ  2008-10-22 08:53:14  No: 145328  IP: 192.*.*.*

解決時チェック入れ忘れました。

編集 削除