Fonction : comparer 2 chaines avec les wildcards * et ?

Contenu du snippet

Cette fonction n'est pas de moi. Je l'ai prise à partir d'un fichier VBS (re)trouvé sur le CD d'un vieux numéro de pcfun (dsl pour la pub). L'auteur d'origine anglaise (d'apres le peu de commentaire) est inconnu.

Cette fonction retourne VRAI si une chaine est comparable à un masque contenant les 'wilcards' (caractères joker) * et ?.
? équivaut UN caractère non nul (pas un espace)
  • équivaut un ou plusieurs caractères


La fonction F_Match retourne VRAI si 'Chaine' ressemble au motif 'Masque'.
La fonction est sensible à la casse !

Exemples :
F_Match("MOTO","MOTO") retourne VRAI
F_Match("MOTO","????") retourne VRAI
F_Match("MOTO","???") retourne FAUX
F_Match("MOTO","?????") retourne VRAI
F_Match("MOTO","???M?O??") retourne VRAI
F_Match("MOTO","M*") retourne VRAI
F_Match("MOTO","*") retourne VRAI
F_Match("MOTO","O*") retourne FAUX
F_Match("MOTO","*O") retourne VRAI

A noter :
F_Match("ABCDEFGH.DAT","ABCDEF??.??T")
est plus rapide que
F_Match("ABCDEFGH.DAT","ABCDEF*.??T")

Source / Exemple :


'---------------------------------------------------------------------------------------
' Procedure : F_Match
' Auteur(Chaine) : ?
'---------------------------------------------------------------------------------------
' Retourne True si Chaine ressemble au motif Masque, case sensitive
' String Masque contient des caractères génériques "*" et "?"
'---------------------------------------------------------------------------------------
Function F_Match(ByVal Chaine As String, ByVal Masque As String) As Boolean
Dim I As Integer
I = 0
'
If (Chaine <> "") And (Masque = "") Then I = 2
While (Masque <> "") And (I <> 2)
   If Chaine = Masque Then
      I = 1
      Masque = ""
   Else
      Select Case Left(Masque, 1)
      Case "*"
     While (Left(Masque, 1) = "*") Or (Left(Masque, 1) = "?")
        Masque = Mid(Masque, 2)
     Wend
     If (Chaine = "") Then
        If F_Match("", Masque) Then
           I = 1
           Masque = ""
           Chaine = ""
        Else
           I = 2
        End If
     Else
        If F_Match(Chaine, Masque) Or F_Match(Mid(Chaine, 2), "*" & Masque) Then
           I = 1
           Masque = ""
           Chaine = ""
        Else
           I = 2
        End If
     End If
      Case "?"
     Masque = Mid(Masque, 2)
     If F_Match(Chaine, Masque) Or F_Match(Mid(Chaine, 2), Masque) Then
        I = 1
        Masque = ""
        Chaine = ""
     Else
        I = 2
     End If
      Case Else
     If Chaine = "" Then
        I = 2
     ElseIf Left(Chaine, 1) = Left(Masque, 1) Then
        Masque = Mid(Masque, 2)
        Chaine = Mid(Chaine, 2)
     Else
        I = 2
     End If
      End Select
      If (Chaine <> "") And (Masque = "") Then I = 2
   End If
Wend
F_Match = (I <> 2)
End Function

Conclusion :


Test :
msgbox F_Match("MOTO","?O*")

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.