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 188

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

Avant propos

La manipulation de chaîne de caractères est une des tâches les plus fréquentes en programmation. La plupart des langages proposent des fonctions spécialisées pour ce travail. Visual Basic ne fait pas exception à la règle et propose plusieurs fonctions, instructions et opérateurs permettant ces manipulations.

Cet article est divisé en 2 parties :

  • Présentation des fonctions de base : Len, Left, Right, Mid, Instr, Split, Join, UCase, LCase, Trim, StrReverse, Replace, Asc, Chr, Space, String
  • Utilisation avancée de ces fonctions pour la réalisation de fonctions complexes : Extraction de mots, Recherche et substitution de motifs complexes, Comptage de mots, etc. Tout ceci est disponible dans l'article : Comment réaliser des fonctions complexes de manipulation de chaînes de caractères ?

Utilisation des Fonctions de Base

Cette partie illustre l'utilisation des fonctions, permettant de calculer des longueurs, d'extraire des caractères, de tester la présence de sous-chaînes au sein de chaînes, de substituer un ou plusieurs caractères ou encore de concaténer plusieurs chaînes.

Comment calculer la longueur d'une chaîne de caractères ?

On dispose pour cela de la fonction Len(), qui retourne le nombre de caractères d'une chaîne.

    Dim s As String
    
    s = "HELLO WORLD"
    Debug.Print Len(s)  ' retourne 11

VB permet de déclarer des chaînes de caractères de taille fixe. Attention dans ce cas, la fonction Len retourne le nombre maximum de caractères, quel que soit le contenu réel de la chaîne. L'utilisation de chaînes de taille fixe est déconseillée sauf cas bien particuliers (dans des UDT pour écriture de fichiers séquentiels par exemple).

    Dim s As String * 32
    
    s = "HELLO WORLD"
    Debug.Print Len(s)  ' retourne 32

Comment concaténer des chaînes de caractères ?

Visual Basic dispose d'un opérateur dédié pour la concaténation de chaînes de caractères : l'opérateur '&' ("et commercial", "esperluette" ou "ampersand").

    Dim s1 As String, s2 As String
    Dim result As String
    
    s1 = "HELLO"
    s2 = "WORLD"
    
    result = s1 & " " & s2
    Debug.Print s   ' retourne "HELLO WORLD"

Remarques

VB tolère l'utilisation de l'opérateur '+' à la place de '&' pour concaténer des chaînes de caractères. L'usage de '+' est déconseillé, tout simplement parce que cela n'est pas correct d'un point de vue sémantique.

La concaténation utilisant '&' est extrêmement lente. L'article Comment réaliser la concaténation de chaînes de caractères rapidement ? explique comment réaliser des concaténations rapides.

Comment extraire une sous-chaîne d'une chaîne ? Comment isoler un ou plusieurs caractères ? Comment tester les caractères d'une chaîne un par un ?

Ces opérations sont très fréquentes. On dispose pour cela de 3 fonctions : Left, Right et Mid, qui permettent d'extraire des caractères respectivement en partant du début, de la fin ou du milieu. Ces fonctions sont très simples à utiliser, les exemples suivants illustrent les utilisations typiques.

    Dim s As String
    
    s = "HELLO WORLD"
    
    ' La fonction Left(s, n) récupère les n caractères les plus à gauche de s
    '
    Debug.Print Left(s, 1)  ' Affiche "H"
    Debug.Print Left(s, 5)  ' Affiche "HELLO"
    
    ' La fonction Right(s, n) récupère les n caractères les plus à droite de s
    '
    Debug.Print Right(s, 1)  ' Affiche "D"
    Debug.Print Right(s, 5)  ' Affiche "WORLD"
    
    ' La fonction Mid(s, Start, Nb) récupère les Nb caractères en partant de Start
    '
    Debug.Print Mid(s, 2, 3)  ' Affiche "ELL"
    Debug.Print Mid(s, 1, 5)  ' Affiche "HELLO"
    Debug.Print Mid(s, 7, 5)  ' Affiche "WORLD"
    Debug.Print Mid(s, 11, 1) ' Affiche "D"
    
    ' Exemple d'utilisation: récupère le dernier caractère d'une chaine
    '
    Debug.Print Mid(s, Len(s), 1)   ' Affiche le dernier caractère de S, ici "D"

Une utilisation fréquente de Mid est la récupération des caractères d'une chaîne, un par un, au moyen d'une boucle. On parcourt ainsi tous les caractères, du premier au dernier, la longueur étant calculée par la fonction Len :

    Dim s As String
    Dim i As Long
    
    s = "HELLO WORLD"
    
    For i = 1 To Len(s)
        Debug.Print Mid$(s, i, 1) & ".";
    Next i
    ' Affiche : "H.E.L.L.O. .W.O.R.L.D."

La fonction Mid permet aussi de ne pas spécifier le dernier argument (la longueur). Dans ce cas, la fonction retourne les caractères depuis la position de départ :

    Dim s As String
    
    s = "HELLO WORLD"
    Debug.Print Mid(s, 2)   ' Affiche "ELLO WORLD"

Remarque

Mid peut aussi être utilisée comme une instruction (et non pas comme une fonction comme vu précédemment). On peut l'employer pour substituer une partie d'une chaîne par une autre.

    Dim s As String
    
    s = "LE CHIEN NOIR"
    
    Mid$(s, 4, 5) = "CYGNE"
    Debug.Print s   ' Affiche "LE CYGNE NOIR"
    
    ' Attention à la taille
    Mid$(s, 4, 5) = "DIPLODOCUS"
    Debug.Print s   ' Affiche "LE DIPLO NOIR"

Comme on le voit dans l'exemple, la substitution ne peut se faire que par une chaîne de taille égale. Pour des remplacements quelconques, on dispose de la fonction Replace présentée plus bas. A noter cependant que l'utilisation de Mid comme instruction est très rapide et permet notamment d'implémenter une méthode de concaténation rapide, comme expliqué dans l'article : Comment réaliser la concaténation de chaînes de caractères rapidement ?

Comment tester la présence d'une sous-chaîne dans une chaîne ?

Comment savoir si une chaîne de caractères contient une sous-chaîne donnée? Il serait bien sûr possible de réaliser cela en créant une fonction utilisant Len, Mid et une boucle. Cependant, VB dispose d'une fonction permettant de réaliser cela directement et assez efficacement : Instr. Cette fonction a plusieurs syntaxes et admet des paramètres optionnels. On se référera à la documentation (voir section Aller plus loin) pour la description complète.

L'utilisation simplifiée est : position = Instr(chaîne1, chaîne2). La fonction retourne la position de départ de chaîne 2 dans chaîne1. Si chaîne2 n'est pas trouvée dans chaîne1, la fonction retourne 0. On peut spécifier en premier paramètre la position de départ de la recherche. L'appel de la fonction devient alors : Instr(départ, chaîne1, chaîne2). Elle retourne la position de départ de chaîne2 dans chaîne1, en commençant la recherche depuis la position départ.

    Dim position As Long
    Dim s As String
    
    s = "LE PETIT CHAT BLANC"
    Debug.Print InStr(s, "PETIT")   ' retourne 4
    Debug.Print InStr(s, "CHAT")    ' retourne 10
    Debug.Print InStr(s, "NOIR")    ' retourne 0
    
    s = "UN CHIEN, UN CHAT, DEUX CHATS, TROIS CHATS"
    
    Debug.Print InStr(s, "CHIEN")       ' retourne 4
    Debug.Print InStr(9, s, "CHIEN")    ' retourne 0
    Debug.Print InStr(1, s, "CHAT")     ' retourne 14
    Debug.Print InStr(15, s, "CHAT")    ' retourne 25
    Debug.Print InStr(30, s, "CHAT")    ' retourne 38

A noter l'existence de InstrRev, qui fait la même chose que Instr, mais en commençant par la fin. Cette fonction existe depuis VB6.

Comment remplacer des occurrences de sous-chaînes dans une chaîne ? Exemple : comment remplacer un mot par un autre dans une chaîne de caractères?

VB dispose, depuis la version 6, d'une fonction très pratique pour remplacer les occurrences d'une chaîne de caractères dans une autre : la fonction Replace"

Pour ceux qui dispose d'une version antérieure, il n'est pas difficile de l'implémenter. Cette fonction à plusieurs syntaxes et admet des paramètres optionnels. On se référera à la documentation (voir section Aller plus loin) pour la description complète.

    Dim s As String
    
    s = "GIRAFE CROCODILE CHAT ZEBU CHAT"
    
    ' Remaplce toutes les occurences de "CHAT"
    Debug.Print Replace(s, "CHAT", "ELEPHANT")      ' Affiche "GIRAFE CROCODILE ELEPHANT ZEBU ELEPHANT"
    
    
    s = "UN CHAPEAU ROND, UN CHAPEAU CARRE, UN CHAPEAU VERT"
    
    ' Remplace uniquement les 2 premières occurences de "CHAPEAU"
    Debug.Print Replace(s, "CHAPEAU", "HIBOU", , 2) ' Affiche "UN HIBOU ROND, UN HIBOU CARRE, UN CHAPEAU VERT"

Comment découper une chaîne de caractères en fonction d'un séparateur ? Application pratique : Comment récupérer les "mots" d'une "phrase" ?

Là encore, il serait possible et même simple de faire cela en utilisant une boucle et la fonction Instr. Mais VB dispose d'une fonction dédiée et très efficace pour faire cela : Split. L'utilisation est très simple : tableau() = Split( chaîne, séparateur ). La fonction "découpe" la chaîne en fonction de séparateur et retourne les "morceaux" dans tableau(), en commençant à l'indice zéro. Il suffit ensuite de parcourir le tableau pour accéder aux éléments.

    Dim s As String
    Dim t() As String
    Dim i As Long
    
    s = "le chien dort sur le tapis"
    
    t = Split(s, " ")
    
    For i = 0 To UBound(t())
        Debug.Print t(i) & "-";     ' Affiche "le-chien-dort-sur-le-tapis"
    Next i
    Debug.Print
    
    Debug.Print t(0)                ' Affiche "le"
    Debug.Print t(2)                ' Affiche "dort"

    ' Affiche le dernier mot, quel que soit la phrase
    '
    Debug.Print t(UBound(t()))      ' Ici, affiche "tapis"

Il existe une fonction symétrique de Split : Join. Celle-ci permet de refabriquer une chaîne en partant d'un tableau de sous-chaînes.

Comment changer la casse : conversion en minuscules, majuscules ?

VB dispose de 2 fonctions dédiées permettant de réaliser cela très simplement :

  • LCase : Conversion en minuscules (Lowercase)
  • UCase : Conversion en majuscules (Uppercase)

    Dim s As String
    
    s = "le lapin magique"
    Debug.Print UCase(s)    ' Affiche "LE LAPIN MAGIQUE"
    
    s = "JE PARLE FORT"
    Debug.Print LCase(s)    ' Affiche "je parle fort"

La fonction StrConv est également une alternative valable pour réaliser toutes sortes de conversions, y compris celles mentionnées ci-dessus. On trouvera un lien vers la documentation de StrConv dans la section "Aller plus loin".

Comment supprimer les espaces superflus en début et/ou fin de chaîne ?

VB dispose de 3 fonctions permettant de réaliser cela très simplement :

  • LTrim : Suppression des espaces à gauche (Left Trim)
  • RTrim : Suppression des espaces à droite (Right Trim)
  • Trim : Suppression des espaces à gauche et à droite

    Dim s As String
    
    s = "    DES ESPACES EN TROP    "
    Debug.Print "->" & LTrim(s) & "<-"  ' Affiche "->DES ESPACES EN TROP    <-"
    Debug.Print "->" & RTrim(s) & "<-"  ' Affiche "->    DES ESPACES EN TROP<-"
    Debug.Print "->" & Trim(s) & "<-"   ' Affiche "->DES ESPACES EN TROP<-"

Comment inverser une chaîne de caractères ?

Il suffit d'utiliser la fonction StrReverse, disponible depuis VB 6.

    Dim s As String
    
    s = "EDNOM EL TUOT RUOJNOB"
    
    Debug.Print StrReverse(s)   ' Affiche "BONJOUR TOUT LE MONDE"

Comment créer une chaîne de caractères contenant n fois le même caractère ?

Il est parfois utile de créer une chaîne de caractères contenant uniquement des espaces, ou un nombre donné d'un caractère, par exemple pour initialiser des champs de longueur fixe. VB dispose de 2 fonctions pratiques : Space(n) et String(nombre, caractère).

    Dim s As String
    
    s = Space(15)
    Debug.Print "->" & s & "<-"     ' Affiche "->               <-"
    
    s = String(8, "X")
    Debug.Print "->" & s & "<-"     ' Affiche "->XXXXXXXX<-"

Comment récupérer le code Ascii d'un caractère, comment transformer un code Ascii en caractère ?

VB dispose pour cela de 2 fonctions : Chr(n), qui retourne le caractère (String) correspondant au code Ascii n, et Asc(car), qui retourne le code Ascii du caractère 'car'.

    Dim car As String
    Dim n As Integer
    
    car = "A"
    
    ' retourne le code Ascii de A majuscule
    Debug.Print "Code Ascii de " & car & "=" & Asc(car) ' Affiche 65
    
    n = 66
    ' convertit le code Ascii 66 en caractère
    Debug.Print "Représentation de " & n & "=" & Chr$(n)      ' Affiche "B"

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, StrConv, Ascii, Code, extraire, longueur, conccaténer, concaténation