4

我有一个需要 2 个字符串参数的方法。一种包含普通字符串,另一种包含带有一个或多个通配符的字符串。我试过以下代码:

Private Function DoesMatchWildcardString(ByVal fullString As String, ByVal wildcardString As String) As Boolean
    Dim stringParts() As String
    Dim matches As Boolean = True

    stringParts = wildcardString.Split("*")

    For Each str As String In stringParts
        If fullString.Contains(str) = False Then
            matches = False
        End If
    Next

    Return matches

End Function

我意识到它不能正常工作。如果我将 ABCD 作为正常字符串,将 A*CD 作为通配符字符串,即使我的正常字符串是 CDAB,匹配也会起作用,这不是我想要的。

有任何想法吗??

非常感谢。

4

3 回答 3

9

您的方法很有趣,但即使纠正后也非常低效。通配符匹配算法的有效实现使用移位或算法的扩展(根据维基百科,某些来源也称为“bitap”,但我自己从未读过)。

对传统移位或算法的唯一更改是在预处理中:对于*您在模式中遇到的每个字符,在此位置启用字母表中的所有字符。

如果您想更正自己的算法,请将Contains调用替换为IndexOf,并提供它应该开始搜索的位置 - 即在上一个匹配之后。这适用于大多数情况,但它会执行非贪婪搜索,在某些情况下可能会失败。详尽的搜索必然会回溯。正如我所说,这是低效的,移位或算法不会受到这个缺点的影响。

但所有这些都是不必要的,因为 VB 已经提供了必要的运算符:Like

If fullString Like wildcardString Then
    ' Yep, matches.
End If

风格说明:

声明变量时始终初始化变量,不要不必要地将声明和初始化分开。

也就是说,写

Dim stringParts As String() = wildcardString.Split("*")
' or, with Option Infer On:
Dim stringParts = wildcardString.Split("*")

If X = False此外,将布尔值与文字 ( ...)进行比较是没有意义的。写吧

If fullString.Contains(str) Then
于 2012-05-16T20:19:07.467 回答
0

试试这个,有帮助吗?

Private Function DoesMatchWildcardString(ByVal fullString As String, ByVal wildcardString As String) As Boolean
    Dim count As Integer = 1
    Dim wildchr As String
    Dim fschr As String
    Dim resultstring As String = String.Empty

    Do Until count - 1 = Len(wildcardString)
        wildchr = Mid$(wildcardString, count, 1)
        fschr = Mid$(fullString, count, 1)
        If wildchr = "*" Then ' this one matches any char
            resultstring = resultstring & fschr
        Else
            If wildchr = fschr Then
                resultstring = resultstring & fschr
            End If
        End If
        count = count + 1
    Loop
    Return resultstring = fullString
End Function
于 2013-05-10T16:31:13.397 回答
0

"*"不代表单个字符,而是任何范围的字符。当你想比较两个字符串时,我发现if maskedtextbox1.text like maskedtextbox2.textormaskedtextbox2.text = maskedtextbox1.text效果很好。

于 2013-05-10T15:21:43.393 回答