4

2つの文字列引数を取るメソッドがあります。1つは通常の文字列を含み、もう1つは1つ以上のワイルドカード文字を含む文字列を含みます。私は次のコードを試しました:

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

あなたのアプローチは興味深いですが、一度修正しても非常に非効率的です。ワイルドカードマッチングアルゴリズムの効率的な実装では、 shift-orアルゴリズムの拡張を使用します(一部のソースでは「bitap」とも呼ばれるWikipediaによると、私自身はそれを読んだことがありません)。

従来のshift-orアルゴリズムへの唯一の変更は、前処理*にあります。パターンで遭遇するそれぞれについて、この位置でアルファベットのすべての文字を有効にします。

独自のアルゴリズムを修正する場合は、Contains呼び出しをに置き換えてIndexOf、検索を開始する位置を指定します。つまり、前回の一致の後です。これはほとんどの場合に機能しますが、状況によっては失敗する可能性のある貪欲でない検索を実行します。徹底的な検索は必然的に後戻りします。私が言ったように、それは非効率的であり、shift-orアルゴリズムはこの欠点に悩まされていません。

ただし、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

"*"単一の文字ではなく、任意の範囲の文字を表します。2つの文字列を比較したい場合、if maskedtextbox1.text like maskedtextbox2.textまたはmaskedtextbox2.text = maskedtextbox1.textが非常にうまく機能することがわかりました。

于 2013-05-10T15:21:43.393 に答える
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 に答える