Voici un petit guide pour d�m�ler les apparents myst�res de la fonction StringRegExp().
StringRegExp( "test" , "pattern" [,
flag ] )
"test" = la cha�ne dans laquelle on recherche la correspondance.
"pattern" = Ou aussi nommer Motif ou encore Mod�le et une cha�ne compos�e de certains caract�res qui permettent � la fonction de savoir pr�cis�ment ce que vous souhaitez retrouver. Pas de If(s), And(s), ou autre.. Ca correspond ou �a ne correspond pas.
flag [optionnel] = Indicateur (drapeau) qui dit � la fonction si vous voulez seulement savoir si le "pattern" � �t� trouv�, ou si vous voulez qu'elle vous retourne le premier �l�ment trouv�, ou si vous voulez qu'elle vous retourne tous les �l�ments dans la cha�ne "test".
Comme vous l'avez constat�,la cha�ne "pattern" est la seule partie compliqu�e de la fonction StringRegExp() (Surnomm�e : SRE). Je crois qu'il est mieux de penser au Pattern comme un �l�ment qui dit � la fonction de faire la correspondance caract�re par caract�re. Il existe diff�rentes m�thodes pour trouver un carat�re : si vous voulez chercher la cha�ne "test", cela sera assez simple. Vous voulez dire � la fonction SRE de chercher en premier un "t" dans la cha�ne. Si elle en trouve un, alors elle supposera avoir trouv� une correspondance, et le reste du pattern est utilis� pour essayer de prouver que ce qu'elle a trouv� n'est pas une correspondance. Donc, si le caract�re suivant est un "e", cela pourrait confirmer une correspondance. Supposons que la lettre suivante soit un "x". SRE sait imm�diatement qu'elle n'a pas trouv� de correspondance puisque le troisi�me caract�re de la cha�ne que vous lui avez dit de regarder est un "s".
Exemple 1 :
MsgBox(0, "SRE Exemple 1 Result", StringRegExp("text", 'test'))
Dans cet exemple, la boite de message devrait lire "0", ce qui signifie que le pattern "test" n'a pas �t� trouv� dans la cha�ne "text". Je sais que cela peut vous para�tre simpliste, mais au moins vous comprenez pourquoi il n'a pas �t� trouv�.
Une autre m�thode pour sp�cifier un pattern consiste � utiliser une paire de de crochet ("[ ... ]"). Vous pouvez consid�rer que l'ensemble est comparable � la fonction logique "OR". Utilisons l'exemple pr�c�dent. Nous voulons trouver l'une ou l'autre des cha�nes suivantes "test" ou "text". Ainsi, la m�thode pour trouver le pattern est de penser comme la fonction SRE penserait: Le premier caract�re � comparer est le "t", ensuite la lettre "e", et ainsi de suite. Maintenant, nous voulons trouver un "s" OU un "x", donc nous allons utiliser les crochets comme substitut : "[sx]" ce qui signifie trouver un "s" ou un "x". Et enfin, la derni�re lettre est de nouveau un "t".
Exemple 2
MsgBox(0, "SRE Example 2 Result", StringRegExp("text", 'te[sx]t'))
MsgBox(0, "SRE Example 2 Result", StringRegExp("test", 'te[sx]t'))
Dans les deux cas, nous aurons le r�sultat "1", puisque le pattern correspond aux cha�nes "test" et "text".
Vous pouvez aussi sp�cifier combien de fois vous voulez la correspondance de chaque caract�re en utilisant "{nombre de correspondance}" ou vous pouvez sp�cifier une plage en utilisant "{min, max}". Le premier exemple ci-dessous est redondant, mais il vous montre ce que je veux dire :
Exemple 3
MsgBox(0, "SRE Example 3 Result", StringRegExp("text", 't{1}e{1}[sx]{1}t{1}'))
MsgBox(0, "SRE Example 3 Result", StringRegExp("aaaabbbbcccc", 'b{4}'))
Tout de suite vous penserez probablement, "N'est-ce pas une fonction StringInStr() am�lior�e?". Bien, en utilisant un "flag" � 0, la plupart du temps vous avez raison. Mais SRE est beaucoup plus puissante que cela. En utilisant SRE de plus en plus souvent, vous constaterez que vous en connaissez de moins en mois sur le type de pattern que vous cherchez. Il y a des mani�res d'�tre de moins en moins sp�cifique sur chaque caract�res que vous voulez sp�cifier dans le pattern. Prenez par exemple une ligne d'un fichier log d'inventaire: "Il restait 18 feuilles dans la rame de papier." Vous voulez trouver le nombre de feuilles restantes. H� bien, vous ne pouvez utiliser StringInStr() parce que vous ne cherchez pas "18", mais plut�t "????", o� ? peut �tre n'importe quel chiffre.
Voici comment j'assemblerais ce pattern. Regardez ce que vous faites et ne connaissez pas ce que vous voulez trouver :
1) Vous savez qu'il contiendra TOUJOURS rien que des chiffres.
2) Vous savez qu'il ce sera PARFOIS d'une longueur de 2 caract�res.
2a) Vous savez qu'une rame pleine contient 500 feuilles.
2b) Vous savez que le minimum de feuille est 0.
3) Vous savez que le nombre de feuilles sera TOUJOURS entre 1 et 3 caract�res.
4) Vous savez qu'il n'y a aucun autre chiffre dans la cha�ne de test.
� ce point, je voudrais pr�senter la valeur "1" du FLAG et les caract�res de groupement "()". La valeur "1" du flag signifie que SRE controlera non seulement votre pattern, mais retournera aussi un tableau, avec chaque �l�ment du tableau constituant un "groupe" de caract�res captur�s . Ainsi sans trop s'�loigner du chemin, consid�rez cet exemple :
Exemple 4
$asResult = StringRegExp("This is a test example", '(test)', 1)
If @error == 0 Then
MsgBox(0, "SRE Example 4 Result", $asResult[0])
EndIf
$asResult = StringRegExp("This is a test example", '(te)(st)', 1)
If @error == 0 Then
MsgBox(0, "SRE Example 4 Result", $asResult[0] & "," & $asResult[1])
EndIf
Donc, pour commencer le pattern doit correspondre quelque part dans la cha�ne d'essai. Si c'est bon, on dit � SRE de "capturer" n'importe quels groupes ("()") et les stocker dans un tableau de retour. Vous pouvez utiliser des captures multiples, comme d�montr� par la deuxi�me partie du code de l'Exemple 4.
Ok, revenons au fichier log. Maintenant que nous savons comment capturer du texte, construisons notre mod�le : Puisque vous savez que vous cherchez des chiffres, il y a 3 fa�ons de sp�cifier la "correspondance de n'importe quel chiffre" : "[:digit:]", "[0-9]", et "\d". La premi�re est probablement la plus facile a comprendre. Il y a quelques classes (digit, alnum, space, etc. V�rifiez le fichier d'aide pour une liste compl�te) Vous pouvez sp�cifier des jeux de caract�res, l'un d'entre eux �tant les chiffres. "[0-9]" sp�cifie simplement une plage de chiffres de 0 � 9. "\d" est juste un caract�re sp�cial qui signifie la m�me chose que pr�c�dement. Il n'y a aucune diff�rence entre les trois solutions, et avec toutes les SRE il y a plusieurs fa�ons de construire n'importe quel pattern.
Donc, pour commencer nous savons que nous voulons capturer des chiffres, indiquez le avec des parenth�ses ouvrantes "(". Ensuite, nous savons que nous voulons capturer entre 1 et 3 caract�res, tous �tant des chiffres, donc notre pattern ressemble maintenant � ceci : "([0-9]{1,3}". Et finalement fermez le avec la parenth�se fermante pour indiquer la fin de notre groupe: "([0-9]{1,3})". Essayons le :
Example 5
$asResult = StringRegExp("Il y avait 18 feuilles restantes dans la rame de papier.", _
'([0-9]{1,3})', 1)
If @error == 0 Then
MsgBox(0, "SRE Example 5 Result", $asResult[0])
EndIf
L� c'est bon, la bo�te de dialogue montre correctement "18".
Ensuite nous devons comprendre les exclusions de groupes. La mani�re d'indiquez ces groupes est d'ouvrir le groupe avec "(?:" au lieu de n'utiliser que "(". Admettons que votre fichier log dit "Vous avez utilis� 36 des 279 pages." Maintenant si vous y ex�cutez la fonction SRE de l'exemple 5 la dessus, vous aurez "36" au lieu de "279". Dans ce cas, ce que je devrais faire c'est de d�terminer ce qui est diff�rent entre les nombres. Ce qui me saute aux yeux c'est que le deuxi�me nombre est toujours suivi par un espace puis par le mot "pages". Nous pourrions juste modifier notre pattern pr�c�dent comme ceci : "([0-9]{1,3} pages)", mais si notre script cherche simplement la quantit� de pages, sans le mot "pages" plant� � la fin du nombre ? C'est l� que vous aurez besoin d'utiliser les exclusions de groupes.
Exemple 6
$asResult = StringRegExp("You used 36 of 279 pages.", '([0-9]{1,3})(?: pages)', 1)
If @error == 0 Then
MsgBox(0, "SRE Example 6 Result", $asResult[0])
EndIf
Cela pourrait devenir tr�s long, mais j'ai surtout voulu montrer les fondements du fonctionnement des expressions r�guli�res et surtout comment SRE "pense". Quelques petites choses � garder en t�te :
- Souvenez-vous de r�fl�chir au pattern caract�re par caract�re
- La fonction StringRegExp() trouve le premier caract�re dans le pattern, puis c'est � vous de fournir suffisamment d'�vidence pour "prouver" si la correspondance est trouv� ou pas. L'exemple 6 est une bonne d�monstration de ceci.
- Rappel� vous [ ... ] signifie OU ([xyz] correspond � un "x", un "y", OU un "z")
Si vous avez d'autre questions, consultez en premier le fichier d'aide ! Il explique en d�tail tous les �l�ments importants de la syntaxe des SRE(s). Une chose � regarder en particulier, c'est la section sur les "Caract�res � R�p�tition". Cela peut rendre votre pattern plus lisible en substituant certains caract�res par des plages. Par exemple : "*" est �quivalant � {0,} Ou la plage de 0 � n'importe quel nombre de caract�res.
Bonne chance, les Expressions R�guli�res peuvent grandement diminuer la longueur de votre code, et le rendre plus simple � modifier ult�rieurement. Les corrections et les retours sont bienvenus !
Wikipedia Article - Regular Expressions - Thanks blindwig.
The 30 Minute Regex Tutorial - by Jim Hollenhorst.
GUI for testing various StringRegExp() patterns - Thanks steve8tch. Credit: w0uter
Thanks to neogia for this tutorial.