我一直在努力从文本文件中获取两个单词之间的字符串,其中这些单词重复多次。
我的文件中包含的内容;
Name: Person1
Age: 20
Name: Person2
Age:21
Name: Person3
Age:22
我想要的是输出;
Person1
Person2
Person3
到目前为止我做了什么;
Public Function StrBtw(ByVal Text_ As String, ByVal Start_ As String, ByVal End_ As String) As String
Dim V As String = Nothing
V = Text_.Substring(Text_.IndexOf(Start_) + Start_.Length, Text_.IndexOf(End_) - Text_.IndexOf(Start_) - Start_.Length)
Return V
End Function
用法;
Dim A As String = myFileString
For i As Integer = 0 To A.Length - 1
If i = A.IndexOf(W) Then
TextBox1.Text &= StrBtw(A, "Name: ", "Age: ")
i = A.IndexOf(W) + "Name: ".Length
End If
Next
当前输出;
Person1
如上所述,输出只显示Person1的名称,而我想要所有名称。我认为可能的原因可能是每次将IndexOf函数返回到第一个“Name:”。 我尝试使用RegEx。我发现它很混乱,结果仍然相同。 我已花了两个小时,所以任何帮助都表示赞赏。
答案 0 :(得分:1)
你说得对,问题是IndexOf
只会以你使用它的方式检索第一次出现。但是,有一个overload将搜索的起始索引作为参数。您可以使用此重载并更改代码,如下所示:
Public Class Test
Public Shared Sub Main()
Dim myFileString = "Name: Person1" & vbNewLine & "Age: 21" & _
"Name: Person2" & vbNewLine & "Age: 21"
Dim result As New System.Text.StringBuilder()
Dim index = myFileString.IndexOf("Name:")
While (index >= 0)
Dim indexAge = myFileString.IndexOf("Age:", index)
If (indexAge >= 0) Then
result.AppendLine(myFileString.SubString(index + 5, indexAge - index - 5).Trim())
End If
index = myFileString.IndexOf("Name:", indexAge)
End While
Console.WriteLine(result)
End Sub
End Class
示例获取第一个没有附加参数的索引;随后的出现使用“年龄:”索引作为起点。您可以运行示例here。
答案 1 :(得分:0)
如果要使用正则表达式,可以使用该代码:
Dim matches = Regex.Matches(myFileString, "(?<=Name:\s).*(?=\n)", RegexOptions.Multiline)
For Each Match In matches
Dim found As String = Match.ToString().Trim()
Next