VB.NET:在文本中搜索某些值

时间:2016-08-30 14:47:42

标签: regex vb.net string parsing

我编写了一段代码来读取字符串并试图从中获取某些部分。

特别是,我想获取自定义文本书写标记中包含的数字:[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

但我不禁觉得这不是最佳选择。我非常确定这可以更轻松地编写,或者借助SubstringIndexOf之外的其他工具。尤其如此,因为我需要对索引和循环进行一些操作。

有关改进这段代码的任何建议吗?

1 个答案:

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