Fonction : comparer 2 chaines avec les wildcards * et ?

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 869 fois - Téléchargée 29 fois

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

Ajouter un commentaire

Commentaires

Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
Utilises des $ :

Mid$
Left$
etc..... ca améliorera les perf ;)


ah ! oui ! au fait ; ca existe déja dans VB :
If "Machaine" Like "*chaine" Then
huelce
Messages postés
45
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
28 juillet 2004
1 -
J'ai essayé avec Like et... ca marche ! C'est génial !
Tu me l'apprends, et dire que j'ai cherché la moitié de la nuit pour ca...
M'enfin pourquoi faire simple quand on peut faire compliqué ?

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.