我编写了一段代码来读取字符串并试图从中获取某些部分。
特别是,我想获取自定义文本书写标记中包含的数字:[propertyid=]
。例如,[propertyid=541]
需要返回541
。
此搜索和检索在文本中进行,并且需要与文本中的标记数量一样频繁发生。
我已经编写了可行的代码
Module Module1
Sub Main()
Dim properties As New List(Of String)
'context of string doesn't matter, only the ids are important
Dim text As String = "Dit is de voorbeeld string. Eerst komt er gewoon tekst. Daarna een property als [propertyid=1155641] met nog wat tekst. Dan volgt nog een [propertyid=1596971418413399] en dan volgt het einde."
Dim found As Integer = 1
Do
found = InStr(found, text, "[propertyid=")
If found <> 0 Then
properties.Add(text.Substring(found + 11, text.IndexOf("]", found + 11) - found - 11).Trim())
found = text.IndexOf("]", found + 11)
End If
Loop While found <> 0
Console.WriteLine("lijst")
For Each itemos As String In properties
Console.WriteLine(itemos)
Next
End Sub
End Module
但我不禁觉得这不是最佳选择。我非常确定这可以更轻松地编写,或者借助Substring
和IndexOf
之外的其他工具。尤其如此,因为我需要对索引和循环进行一些操作。
有关改进这段代码的任何建议吗?
答案 0 :(得分:4)
您可以使用regular expressions执行此类任务。
在这种情况下,匹配[propertyid=NNNN]
的模式是:
\[propertyid=(\d+)\]
在一个捕获组(括号)中隔离一组一个或多个数字 - \d+
- 以便匹配引擎可以检索它。
这是一个代码示例:
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim properties As New List(Of String)
'context of string doesn't matter, only the ids are important
Dim text As String = "Dit is de voorbeeld string. Eerst komt er gewoon tekst. Daarna een property als [propertyid=1155641] met nog wat tekst. Dan volgt nog een [propertyid=1596971418413399] en dan volgt het einde."
Dim pattern As String = "\[propertyid=(\d+)\]"
For Each m As Match In Regex.Matches(text, pattern)
properties.Add(m.Groups(1).Value)
Next
For Each s As String In properties
Console.WriteLine(s)
Next
Console.ReadKey()
End Sub
End Module