Comment réaliser des manipulations de chaînes de caractères ?
Avant proposLa 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 BaseCette 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) 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) 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 RemarquesVB 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" Debug.Print Left(s, 1) Debug.Print Left(s, 5) Debug.Print Right(s, 1) Debug.Print Right(s, 5) Debug.Print Mid(s, 2, 3) Debug.Print Mid(s, 1, 5) Debug.Print Mid(s, 7, 5) Debug.Print Mid(s, 11, 1) Debug.Print Mid(s, Len(s), 1) 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 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) RemarqueMid 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 Mid$(s, 4, 5) = "DIPLODOCUS" Debug.Print s 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") Debug.Print InStr(s, "CHAT") Debug.Print InStr(s, "NOIR") s = "UN CHIEN, UN CHAT, DEUX CHATS, TROIS CHATS" Debug.Print InStr(s, "CHIEN") Debug.Print InStr(9, s, "CHIEN") Debug.Print InStr(1, s, "CHAT") Debug.Print InStr(15, s, "CHAT") Debug.Print InStr(30, s, "CHAT")
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" Debug.Print Replace(s, "CHAT", "ELEPHANT") s = "UN CHAPEAU ROND, UN CHAPEAU CARRE, UN CHAPEAU VERT" Debug.Print Replace(s, "CHAPEAU", "HIBOU", , 2) 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) & "-"; Next i Debug.Print Debug.Print t(0) Debug.Print t(2)
Debug.Print t(UBound(t())) 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) s = "JE PARLE FORT" Debug.Print LCase(s) 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) & "<-" Debug.Print "->" & RTrim(s) & "<-" Debug.Print "->" & Trim(s) & "<-" 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) 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 & "<-" s = String(8, "X") Debug.Print "->" & s & "<-" 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" Debug.Print "Code Ascii de " & car & "=" & Asc(car) n = 66 Debug.Print "Représentation de " & n & "=" & Chr$(n) Pour aller plus loin Voir aussi : |