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
Split関数ではどうしようもないです。
正規表現を工夫して,Regex.Split使うのが一番早いかと思います。
どうでもいいけど気になること。
・スピリット spirit:心,精神
・スプリット split :分割[分離]する
。。。ボーリングとかしないのかな?
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
"##"や"###"は一度、"@"などの特定の文字に変換してから
スプリットして、特定の文字を元に戻す。
特定の文字は、含まれない文字にする必要がありますけどね。
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さんの正規表現素晴らしいです"#"が何個
連続で入っていても問題なしですね(笑)
プログラムに取り込み解決しました
ありがとうございます。
解決時チェック入れ忘れました。
編集 削除