Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 187

Comment réaliser des manipulations complexes de chaînes de caracères ?

Cet article est la suite logique de l'article Comment réaliser des manipulations de chaînes de caractères ?, qui présentait les fonctions de base de VB dédiées à la manipulation de chaînes de caractères.

Cet article propose d'aller plus loin, en proposant un ensemble de fonctions de manipulation de chaînes de caractères plus complexes, basées sur les fonctions de base évoquées précédemment. Le but de cet article est double : d'une part proposer un ensemble de fonctions de haut niveau prêtes à l'emploi, d'autre part illustrer par des exemples concrets l'utilisation des "briques de base" que sont les fonctions de VB, pour la réalisation de fonctions complexes.

Comment déterminer si un caractère est une voyelle une consonne ?

Principe : Conversion du caractère en majuscule, et recherche de ce caractère dans une chaîne contenant toutes les voyelles en majuscule. Pour déterminer si un caractère est une consonne, le principe est le même. Note : les deux fonctions retournent False si la chaîne de caractère est vide.

'---------------------------------------------------------------------------------------
' Procedure : IsVowel
' Purpose   : Retourne True si le caractère en paramètre est une voyelle
' Sample    : IsVowel("A") => True, IsVowel("B") => False
'---------------------------------------------------------------------------------------
'
Private Function IsVowel(ByVal szString As String) As Boolean
    Const vowels As String = "AEIOUY"
    
    szString = Trim$(szString)
    If szString <> "" Then
        IsVowel = (InStr(vowels, Left$(UCase$(szString), 1)) > 0)
    End If
End Function

'---------------------------------------------------------------------------------------
' Procedure : IsConsonant
' Purpose   : Retourne True si le caractère en paramètre est une consonne
' Sample    : IsConsonant("A") => False, IsConsonant("B") => True
'---------------------------------------------------------------------------------------
'
Private Function IsConsonant(ByVal szString As String) As Boolean
    Const consonants As String = "BCDFGHJKLMNPQRSTVWXZ"
    
    szString = Trim$(szString)
    If szString <> "" Then
        IsConsonant = (InStr(consonants, Left$(UCase$(szString), 1)) > 0)
    End If
End Function

Comment mettre en majuscule le premier caractère de chaque mot d'une chaîne de caractères ?

Principe : on sépare les mots en recherchant les espaces, et on met en majuscule la première lettre de ce qui suit. A noter que cette fonction pourrait être remplacée par un simple appel à la fonction StrConv, dont la documentation est donnée dans la section "Aller plus loin".

'---------------------------------------------------------------------------------------
' Procedure : UpperCamelCase
' Purpose   : Retourne la chaine initiale après conversion de la première lettre de
'             chaque mot en majuscule
' Sample    : "sic transit gloria mundi" => "Sic Transit Gloria Mundi"
'---------------------------------------------------------------------------------------
'
Private Function UpperCamelCase(ByVal szString As String) As String
    Dim posspc As Long
    Dim length As Long
    Dim start As Long

    length = Len(szString)
    If length > 0 Then
        Mid$(szString, 1, 1) = UCase(Mid$(szString, 1, 1))
        start = 1
        posspc = InStr(start, szString, " ")
        While (posspc > 0) And (posspc <> length)
            Mid$(szString, posspc + 1, 1) = UCase(Mid$(szString, posspc + 1, 1))
            start = start + 1
            posspc = InStr(start, szString, " ")
        Wend
    End If
    
    UpperCamelCase = szString
End Function

Comment compter le nombre de mots d'une chaîne de caractères ?

Principe : on recherche dans la chaîne les occurrences d'espaces ou d'équivalents. La méthode proposée ici permet de compter les mots et uniquement les mots, indépendamment du nombre ou du type de séparateurs.

'---------------------------------------------------------------------------------------
' Procedure : CountWords
' Purpose   : Retourne le nombre de mots d'une phrase
' Sample    : CountWords("Sic  Transit   Gloria   Mundi") => 4
'---------------------------------------------------------------------------------------
'
Public Function CountWords(ByVal aText As String) As Long

    Const Whitechars As String = " " & vbCr & vbLf & vbTab
    Dim i As Long

    Dim ReadingWSP As Boolean
    Dim Result As Long

    ReadingWSP = True
    Result = 0

    For i = 1 To Len(aText)
        If (ReadingWSP) Then
            If (InStr(1, Whitechars, Mid$(aText, i, 1)) = 0) Then
                Result = Result + 1
                ReadingWSP = False
            End If
        Else
            ReadingWSP = (InStr(1, Whitechars, Mid$(aText, i, 1)) <> 0)
        End If
    Next i

    CountWords = Result
End Function

Quand on ne doit pas prendre en compte la présence de multiples espaces, ou d'une manière générale pour compter le nombre d'éléments séparés par un séparateur dans une chaîne donnée, on peut utiliser la fonction Split ; Ceci peut être utile pour compter les champs dans un enregistrement de type "csv".

'---------------------------------------------------------------------------------------
' Procedure : CountFields
' Purpose   : Retourne le nombre de "champs" d'un record de type CSV
' Sample    : CountFields("pierre;dupont;;1969;rennes", ";") => 5
'---------------------------------------------------------------------------------------
'
Public Function CountFields(ByVal aText As String, ByVal sep As String) As Long

    Dim t() As String

    t() = Split(aText, sep)
    CountFields = UBound(t()) + 1
    
End Function

Comment tester si une chaîne de caractères est alphabétique ou numérique ?

Les fonctions suivantes permettent de tester si une chaîne de caractères est alphabétique, alphabétique majuscule, alphabétique minuscule ou constituée de chiffres uniquement.

'---------------------------------------------------------------------------------------
' Procedure : IsLowerAlpha
' Purpose   : Retourne True si la chaine passée en paramètre ne comporte
'             que des caractères alphabétiques minuscule
'---------------------------------------------------------------------------------------

Private Function IsLowerAlpha(szString As String) As Boolean
    Dim i As Long
    Dim Length As Long
    Dim car As String
     
    Length = Len(szString)
    If Length > 0 Then
        For i = 1 To Length
            car = Mid$(szString, i, 1)
            If Not ((car >= "a") And (car <= "z")) Then
                Exit Function
            End If
        Next i
        IsLowerAlpha = True
    End If
    
End Function

'---------------------------------------------------------------------------------------
' Procedure : IsUpperAlpha
' Purpose   : Retourne True si la chaine passée en paramètre ne comporte
'             que des caractères alphabétiques majuscule
'---------------------------------------------------------------------------------------

Private Function IsUpperAlpha(szString As String) As Boolean
    Dim i As Long
    Dim Length As Long
    Dim car As String
     
    Length = Len(szString)
    If Length > 0 Then
        For i = 1 To Length
            car = Mid$(szString, i, 1)
            If Not ((car >= "A") And (car <= "Z")) Then
                Exit Function
            End If
        Next i
        IsLowerAlpha = True
    End If
End Function

'---------------------------------------------------------------------------------------
' Procedure : IsAlpha
' Purpose   : Retourne True si la chaine passée en paramètre ne comporte
'             que des caractères alphabétiques (majuscule ou minuscule)
'---------------------------------------------------------------------------------------
Private Function IsAlpha(szString As String) As Boolean
    Dim i As Long
    Dim Length As Long
    Dim car As String
     
    Length = Len(szString)
    If Length > 0 Then
        For i = 1 To Length
            car = Mid$(szString, i, 1)
            If Not (((car >= "A") And (car <= "Z")) Or _
                   ((car >= "a") And (car <= "z"))) Then
                Exit Function
            End If
        Next i
        IsLowerAlpha = True
    End If
End Function

'---------------------------------------------------------------------------------------
' Procedure : IsDigit
' Purpose   : Retourne True si la chaine passée en paramètre ne comporte
'             que des chiffres
'---------------------------------------------------------------------------------------
Private Function IsDigit(szString As String) As Boolean
    Dim i As Long
    Dim Length As Long
    Dim car As String
     
    Length = Len(szString)
    If Length > 0 Then
        For i = 1 To Length
            car = Mid$(szString, i, 1)
            If Not ((car >= "0") And (car <= "9")) Then
                Exit Function
            End If
        Next i
        IsLowerAlpha = True
    End If
End Function

Pour savoir si une chaîne de caractères est un "nombre", on se référera à l'article très complet : Comment déterminer si ma chaine de caractères est un nombre ?.

Pour aller plus loin

Voir aussi :

Date de publication : 06 mars 2008
Dernière modification : 06 mars 2008
Rubriques : Divers, Texte & strings
Mots-clés : chaines de caractères, chaines, chaine, chaîne, chaînes, caractères, caractère, Len, Left, Right, Mid, Instr, InstrRev, Split, Join, UCase, LCase, Ltrim, Rtrim, Trim, StrReverse, Replace, Asc, Chr, String, Space, Ascii, Code, extraire, longueur, conccaténer, concaténation, substitution, recherche, pattern, motif, voyelle, consonne, minuscule, majuscule, compter, mots, sous chaine, sous chaîne