PowerShell : manipuler les chaînes de caractères avec IndexOf et LastIndexOf
Sommaire
I. Présentation
Dans ce tutoriel, nous allons voir comment utiliser les méthodes IndexOf et LastIndexOf de PowerShell pour extraire une sous-chaîne (substring) d'une chaîne de caractères.
Précédemment, et sur le même thème, nous avions vu comment utiliser les méthodes Split() et Substring() de PowerShell. Avec IndexOf et LastIndexOf, nous allons pouvoir aller un peu plus loin dans l'utilisation de Substring() notamment.
II. PowerShell et IndexOf
La méthode IndexOf() permet de rechercher la position d'un caractère ou d'une chaîne au sein d'une chaîne de caractères. Elle va retourner la position de la première occurrence du caractère recherché ou de la chaîne recherchée. Ni plus ni moins.
Prenons un exemple avec la variable $URL :
$URL = "www.it-connect.fr"
Recherchons la position du caractère "." :
$URL.IndexOf(".")
On peut voir que la commande retourne "3", tout simplement. Cela signifie que le point a été trouvé à la position "3" de la chaîne de caractères. Ce qui est correct puisque le premier caractère de la chaîne correspond à l'index 0.
Comme je le disais, on peut également rechercher une chaîne de caractères. Par exemple, on peut rechercher "it" :
$URL.IndexOf("it")
Cette commande va retourner la valeur "4" : c'est bien le "i" qui est en 4ème position, ce qui correspond au début de la chaîne recherchée.
Si l'on recherche une chaîne et qu'elle n'a pas été trouvée, la valeur retournée sera "-1". La preuve en image :
Il faudra retenir que IndexOf() recherche la première occurrence la chaîne recherchée, en partant de l'index 0, de la gauche vers la droite.
III. PowerShell et LastIndexOf
La méthode LastIndexOf() permet de rechercher la dernière position d'un caractère ou d'une chaîne au sein d'une chaîne de caractères. La différence avec IndexOf() est subtile, mais importante : LastIndexOf recherche la dernière occurrence d'un caractère, et non pas la première.
Reprenons l'exemple précédent avec la variable $URL :
$URL = "www.it-connect.fr"
Puis, cette fois-ci, utilisons LastIndexOf :
$URL.LastIndexOf(".")
On peut voir que la commande retourne le résultat "14" : ce qui correspond à la position du point de ".fr".
Dans le même esprit, nous pouvons rechercher une chaîne de plusieurs caractères et dans le cas où la chaîne est introuvable, le résultat "-1" sera retourné.
IV. PowerShell : exemples d'utilisation IndexOf et LastIndexOf
Maintenant que nous avons à quoi servait IndexOf() et LastIndexOf(), il est temps de voir ce que ça peut donner dans la pratique !
A. PowerShell : extraire une chaîne comprise entre deux caractères
Reprenons notre variable $URL :
$URL = "www.it-connect.fr"
L'objectif va être le suivant : récupérer la chaîne comprise entre le premier point et le tiret. Autrement dit, obtenir la valeur "it".
Commençons par récupérer la position du premier point :
$Debut = $URL.IndexOf(".")
Résultat : la variable $Debut est égale à 3.
Et celle du tiret :
$Fin = $URL.LastIndexOf("-")
Résultat : la variable $Fin est égal à 6.
Maintenant que l'on connaît le point de départ dans la chaîne et la fin, il faut que l'on récupère ce qu'il y a entre deux. Pour cela, nous allons utiliser la méthode Substring().
Pour rappel, Substring() permet d'extraire une sous-chaîne d'une chaîne de caractères en précisant : l'index de départ (StartIndex) et le nombre de caractères après cet index.
On peut considérer que :
- Le point de départ, ce sera "$Debut+1" : il faut ajouter +1 car sinon nous allons récupérer le "." puisque $Debut contient la position du point.
- Le nombre de caractères à conserver, ce sera "$Fin-$Debut-1" : voilà, je vous ai perdu. Explications : pour savoir combien il y a de caractères à extraire, il suffit de faire une soustraction "$Fin - $Debut" (= 3) puisque cela donne l'écart entre les deux points de référence. Enfin, on fait "-1" en complément pour éliminer le caractère de référence ("-") sur le même principe qu'avec $Debut. On obtient donc : 2, soit 2 caractères à extraire.
Si l'on traduit tout cela en PowerShell, on obtient la ligne suivante :
$URL.Substring($Debut+1,$Fin-$Debut-1)
On obtient bien la valeur "it" en retour, cela fonctionne ! Vous pouvez vous amuser à tester avec d'autres combinaisons.
Dans le cas où l'on aurait recherché la chaîne comprise entre les deux points, on aurait pu le faire avec avec Split() en récupérant le deuxième membre (index 1) du tableau obtenu :
($URL.Split("."))[1]
Ce que nous venons de voir est peut-être l'exemple le plus "puissant" avec IndexOf(), LastIndexOf() et Substring(). Si vous en connaissez d'autres, n'hésitez pas à les partager en commentaire !
B. Extraire une chaîne par la gauche
En combinant l'utilisation de Substring() et IndexOf() ou LastIndexOf(), on peut extraire une partie d'une chaîne en partant du début. L'idée est la suivante : extraire le sous-domaine de notre URL, donc tout ce qui est avant le premier point.
$URL = "www.it-connect.fr"
On récupère la position du premier point :
$Debut = $URL.IndexOf(".")
Ensuite, avec Substring() on part du premier caractère correspond à l'index 0 et on récupère le nombre de caractères définit dans $Debut. Comme on part de l'index 0, il n'est pas nécessaire de faire +1.
Ce qui donne :
$URL.Substring(0,$Debut)
Résultat, j'obtiens la valeur "www" : c'est correct !
Ce tutoriel sur IndexOf() et LastIndexOf() touche à sa fin, vous avez deux cordes supplémentaires à votre arc lorsqu'il s'agit de manipuler les chaînes de caractères en PowerShell. Je dois avouer que Split() et Substring() restent ceux que j'utilise le plus souvent.
Merci pour ce tuto !! Toujours très clair !
Au dela de l’extraction expliquée dans ce tuto , quelle serait la procédure si on souhaitait ajouter une chaîne de caractères dans une autre chaîne de caractères ?
salut,
en testant la commande j’ai reçu ce message d’erreur:
Échec lors de l’appel de la méthode, car [System.IO.FileInfo] ne contient pas de méthode nommée « LastIndexof ».
Au caractère Ligne:5 : 5
+ $Position = $CurrentFolder1.LastIndexOf(« \ »)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation : (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
comment régler cela?
merci d’avance.