我有一个字符串,它是文本文件的一部分。我需要提取与每个项目相关的数据。
字符串是:
GRID“ G1全球”标签“ A 2 3” DIR“ X-1”编码0可见“是”
我使用“按空格”和“引号”分隔,但结果却不如我预期。我需要为每个项目分配数据。例如,对于GRID为“ G1全局”,对于COORD为0。
我使用tis代码从字符串中提取每个单词:
Dim linestring As Object
Dim word0 As String
Dim i As Integer
Dim goalstring As String = TextBox2.Text 'Thextbox2.text = GRID "G1 Global" LABEL "A 2 3" DIR "X-1" COORD 0 VISIBLE "Yes"
'linestring = Split(goalstring, """")
linestring = Split(goalstring, " ")
For Each word0 In linestring
If word0 <> "" Then
i += 1
Console.WriteLine(i & ":" & word0)
End If
Next
预期结果是:
1:GRID
2:G1全球
3:LABEL
4:A 2 3
5:DIR
6:X-1
7:COORD
8:0
9:可见
10:“是”
但是我是通过Split(goalstring,“”)得到这个的:
1:GRID
2:“ G1
3:全球”
4:LABEL
5:“ A
6:2
7:3“
8:DIR
9:“ X-1”
10:COORD
11:0
12:可见
13:“是”
,并通过Split(goalstring,“”“”)实现:
1:网格
2:G1全球
3:标签
4:A 2 3
5:DIR
6:X-1
7:显示0可见
8:是
答案 0 :(得分:3)
虽然使用regex表达式绝对可以,但我个人认为它很钝且难以调试。我宁愿写个人代码-例如下面的代码遍历字符串的每个字符。
如果找到的字符不是空格或引号,则将其添加到word0
中。
如果找到空格,则会将word0
写入控制台。
如果找到引号,则会将引号后的所有内容添加到word0
,直到找到下一个引号为止。然后它将word0
写入控制台。
Dim word0 As String = ""
Dim goalstring As String = TextBox2.Text
For i As Integer = 0 To goalstring.Length - 1
Select Case goalstring(i)
Case " "c
Console.WriteLine(word0)
word0 = ""
Case """"c
Do While goalstring(i + 1) <> """"
i += 1
word0 = word0 & goalstring(i)
Loop
Console.WriteLine(word0)
i += 2
word0 = ""
Case Else
word0 = word0 & goalstring(i)
End Select
Next
如果要在最后输出的行周围加上引号,则需要更改代码以将每个单词添加到列表中,而不是写入控制台。然后将引号添加到列表中的最后一项,然后将列表写入控制台。