如何通过两个不同的拆分选项提取字符串?

时间:2019-01-10 15:47:44

标签: vb.net

我有一个字符串,它是文本文件的一部分。我需要提取与每个项目相关的数据。
字符串是:
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:是

1 个答案:

答案 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

如果要在最后输出的行周围加上引号,则需要更改代码以将每个单词添加到列表中,而不是写入控制台。然后将引号添加到列表中的最后一项,然后将列表写入控制台。