将字符串匹配到许多RegEx模式之一

时间:2013-01-31 19:33:26

标签: regex vb.net dataset

我有一个名为ds_SortPlan的全局DataSet,用于将匹配特定正则表达式模式的字符串映射到整数。

Private Function MatchDestination(ByVal code As String) As Integer
    Dim m As Match
    For Each tempRow As Data.DataRow In ds_SortPlan.Tables("MatchCode_Lookup").Rows
        m = Regex.Match(code, tempRow.Item("Match_String"))
        If m.Success Then
            Return tempRow.Item("ID")
            Exit Function
        End If
    Next tempRow
    Return 0
End Function

这似乎是一种非常缓慢而笨重的方式。 :( 有没有更好的方法来设置一个正则表达式,它将采用字符串代码并尝试将其与返回相关ID号的多个模式进行匹配。

我想尽可能保留DataSet,因为它有很多依赖项。

感谢任何建议!

3 个答案:

答案 0 :(得分:0)

如果不重新考虑对象模型,你不能真正使这个方法更快,但你可以写得更短(在我看来更可读):

Private Function MatchDestination(ByVal code As String) As Integer
    For Each row In ds_SortPlan.Tables("MatchCode_Lookup").Rows
        If Regex.Match(code, row.Item("Match_String")).Success Then
            Return row.Item("ID")
        End If
    Next row
    Return 0
End Function

答案 1 :(得分:0)

如果您经常调用此函数,则可以存储模式并重复使用它们,而不是每次都从数据库中读取它们

Private Function MatchDestination(ByVal input As String) As Integer
    Static patterns As List(Of KeyValuePair(Of Integer, String))

    If patterns Is Nothing Then
        patterns = New List(Of KeyValuePair(Of Integer, String))
        For Each row As DataRow In ds_SortPlan.Tables("MatchCode_Lookup").Rows
            Dim entry = New KeyValuePair(Of Integer, String)( _
                DirectCast(row.Item("ID"), Integer), _
                DirectCast(row.Item("Match_String"), String) _
            )
            patterns.Add(entry)
        Next
    End If

    For Each pattern As KeyValuePair(Of Integer, String) In patterns
        If Regex.IsMatch(input, pattern.Value) Then
            Return pattern.Key
        End If
    Next
    Return 0
End Function

注意:Exit Function之后您不需要ReturnReturn替换了VB6中的旧Exit Function

答案 2 :(得分:0)

您可以在那里添加缓存。为正则表达式创建一个静态数组,并从那里使用旧的正则表达式对象,而不是每次都重新创建它们。 如果要使用它们,也不要忘记编译正则表达式。这将在第二次或更长时间使用时为您提供更多性能。因此缓存+编译正则表达式将为您带来性能提升;但它会让它在首次运行时变慢。只需在创建新的正则表达式时向参数添加RegexOptions.Compiled。