VB.Net中的子串方法

VB.Net中的子串方法,vb.net,Vb.net,我有文本框行: { LstScan = 1,100, DrwR2 = 0000000043 } { LstScan = 2,200, DrwR2 = 0000000041 } { LstScan = 3,300, DrwR2 = 0000000037 } 我应该展示: 1,100 2,200 3,300 这是一个我不能带到工作阶段的代码 Dim data As String = TextBox1.Lines(0) ' Part 1: get the index of a separ

我有文本框行:

{ LstScan = 1,100, DrwR2 = 0000000043 }
{ LstScan = 2,200, DrwR2 = 0000000041 }
{ LstScan = 3,300, DrwR2 = 0000000037 }
我应该展示:

1,100
2,200
3,300
这是一个我不能带到工作阶段的代码

 Dim data As String = TextBox1.Lines(0)
    ' Part 1: get the index of a separator with IndexOf.
    Dim separator As String = "{ LstScan ="
    Dim separatorIndex = data.IndexOf(separator)
    ' Part 2: see if separator exists.
    ' ... Get the following part with Substring.
    If separatorIndex >= 0 Then
        Dim value As String = data.Substring(separatorIndex + separator.Length)
        TextBox2.AppendText(vbCrLf & value)
    End If
显示如下:

1,100, DrwR2 = 0000000043 }

您的问题是您正在使用从开始索引到字符串结尾的子字符串版本:

"hello world".Substring(3) 'take from 4th character to end of string
lo世界

使用另一个数字作为要剪切长度的子字符串版本:

"hello world".Substring(3, 5) 'take 5 chars starting from 4th char
洛沃

如果字符串长度不同,需要提取,则必须运行另一个搜索(例如,搜索第一次出现的
,在起始字符之后,并从新找到的索引中减去起始索引)


事实上,我可能会使用Split,因为它干净易读:

 Dim data As String = TextBox1.Lines(0)
 Dim arr = data.Split() 
 Dim thing = arr(3)
thing
现在包含
1100,
,您可以使用
TrimEnd(“,”c)
删除最后一个逗号

 thing = thing.TrimEnd(","c)
您可以将其缩减为一行:

TextBox1.Lines(0).Split()(3).TrimEnd(","c)

您的问题是您正在使用从开始索引到字符串结尾的子字符串版本:

"hello world".Substring(3) 'take from 4th character to end of string
lo世界

使用另一个数字作为要剪切长度的子字符串版本:

"hello world".Substring(3, 5) 'take 5 chars starting from 4th char
洛沃

如果字符串长度不同,需要提取,则必须运行另一个搜索(例如,搜索第一次出现的
,在起始字符之后,并从新找到的索引中减去起始索引)


事实上,我可能会使用Split,因为它干净易读:

 Dim data As String = TextBox1.Lines(0)
 Dim arr = data.Split() 
 Dim thing = arr(3)
thing
现在包含
1100,
,您可以使用
TrimEnd(“,”c)
删除最后一个逗号

 thing = thing.TrimEnd(","c)
您可以将其缩减为一行:

TextBox1.Lines(0).Split()(3).TrimEnd(","c)
这应该起作用:

Function ParseLine(input As String) As String
    Const startKey As String = "LstScan = "
    Const stopKey  As String = ", "

    Dim startIndex As String = input.IndexOf(startKey)
    Dim length As String = input.IndexOf(stopKey) - startIndex
    Return input.SubString(startIndex, length)
End Function

TextBox2.Text = String.Join(vbCrLf, TextBox1.Lines.Select(AddressOf ParseLine))
如果我愿意,我可以把整件事变成一条(杂乱的)线。。。但这更具可读性。如果我不确信文本框中的每一行都会匹配该格式,我还可以在
Select()
之前插入
Where()
,这样应该可以:

Function ParseLine(input As String) As String
    Const startKey As String = "LstScan = "
    Const stopKey  As String = ", "

    Dim startIndex As String = input.IndexOf(startKey)
    Dim length As String = input.IndexOf(stopKey) - startIndex
    Return input.SubString(startIndex, length)
End Function

TextBox2.Text = String.Join(vbCrLf, TextBox1.Lines.Select(AddressOf ParseLine))

如果我愿意,我可以把整件事变成一条(杂乱的)线。。。但这更具可读性。如果我不确定文本框中的每一行都会匹配该格式,我还可以在
Select()

子字符串重载指定长度之前插入
Where()
。如果这种模式一直存在,您可以执行data.Substring(separatorIndex+separator.Length,5),您最好使用一个内置的JSON解析器。Substring在指定长度的地方有一个重载。如果这种模式一直存在,那么您可以使用data.Substring(separatorIndex+separator.Length,5)执行操作,使用内置的JSON解析器可能会更好。