[R] StringRegExp() pour extraire plusieurs paramètres

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Dinosaure
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 06 oct. 2011 16:36
Status : Hors ligne

[R] StringRegExp() pour extraire plusieurs paramètres

#1

Message par Dinosaure »

Bonjour !

J'aurais besoin d'aide pour une StringRegExp récalcitrante...

En partant d'un array $Key["STRING( an , b,c ,d) ", '#an "." #b "." #c "." #d'], la première partie de mon idée demande de créer un array $table["an","b","c","d"] tiré de $Key[0], retournant le contenu des parenthèses splitté pour chaque virgule, sans prendre les espaces en compte. La simplicité de supprimer les espaces via StringReplace() puis de découper autour des parenthèses en StringRegExp() pour finir à la moulinette sur le caractère "," est valide, je voudrais le faire en une-seule étape avec une StringRegExp si possible. L'alternative trouvée étant de préparer un paterne pour, disons, une 12 aine de paramètres acceptables prédéfinis (exemple : ".a.,.b.,.c.......,.z."), mais ce serait dommage.

J'en suis là :

Code : Tout sélectionner

Local $Key = ["STRING( an , b,c ,d )", '#an "." #b "." #c "." #d']
        ;(.*?) = anything here (.), whatever how much elements (*)
        ;Local $table = StringSplit(StringRegExp(StringReplace($Key[0], " ", ""), "\((.*)\)", 3)[0], ",");OK
        ;$Key[0] = "STRING( an, b,c ,d )"
        ;"\(\h*(\H+)\h*\)" = "an,"
        ;[(]\h*([^\h,)]+)\h*[,]?.* = "an"
        ;[,]+\h*([^,]+)\h*[,]* = "b"
        ;.*[,]+\h*([^,]+)\h*[,]+.* = "c"
        Local $table = StringRegExp($Key[0], "\(\h*([^\h,)]+)\h*[,]\h*([^\h,)]+)\h*[,]\h*([^\h,)]+)\h*[,]\h*([^\h,)]+).*\h*\)", 3);Nok
        _ArrayDisplay($table, "$table")
Je ne sais pas utiliser une regexp pour retourner un nombre indéfini de résultats, pourriez-vous m'aider ? :)
Modifié en dernier par Dinosaure le lun. 29 juin 2015 14:05, modifié 3 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] StringRegExp() pour extraire plusieurs paramètres

#2

Message par jguinch »

Merci de ne pas utiliser la coloration syntaxique dans cette partie du forum.

Pour la regex, essai avec ça :

Code : Tout sélectionner

Local $table = StringRegExp($Key[0], "[\(,]\h*(.+?)(?=\h*[,\)])", 3)
[\(,] : "(" ou ","
\h* : espace horizontal 0 ou plusieurs fois
(.+?) : au moins un caractère (le ? après le .+ permet de prendre la plus petite occurence)
(?=\h*[,\)]) : jusqu'au caractère suivi de 0 ou plusieurs espaces, suivi de "," ou ")"
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Dinosaure
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 06 oct. 2011 16:36
Status : Hors ligne

Re: [..] StringRegExp() pour extraire plusieurs paramètres

#3

Message par Dinosaure »

Merci bien ! Désolé pour la coloration dans cette partie du forum.

ZDS m'a fait remarquer que ma demande était un-peu trop brouillon, donc voilà la reformulation :
Je voudrais récupérer le contenu des paramètres entre parenthèse dans la chaîne de caractère "STRING( an , b,c ,d )" via StringRegExp.
Avec le code-exemple simplifié :

Code : Tout sélectionner

#include <Array.au3>
Local $string = "STRING( an , b,c ,d )"
Local $table = StringRegExp($string, "\(\h*([^\h,)]+)\h*[,]\h*([^\h,)]+)\h*[,]\h*([^\h,)]+)\h*[,]\h*([^\h,)]+).*\h*\)", 3);Nok
_ArrayDisplay($table, "$table")
Je teste ta solution tout de suite, jguinch, elle semble vraiment correspondre. Pourrais-je avoir une petite explication de la formule utilisée ?
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [R] StringRegExp() pour extraire plusieurs paramètres

#4

Message par jguinch »

J'ai édité mon post précédent pour ajouter un petite explication.

Ceci dit, il y avait plus simple :

Code : Tout sélectionner

Local $table = StringRegExp($Key[0], "[\(,]\h*([^,\)]+)", 3)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Dinosaure
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 06 oct. 2011 16:36
Status : Hors ligne

Re: [R] StringRegExp() pour extraire plusieurs paramètres

#5

Message par Dinosaure »

jguinch a écrit :Ceci dit, il y avait plus simple :

Code : Tout sélectionner

Local $table = StringRegExp($Key[0], "[\(,]\h*([^\h,\)]+)", 3)
Ah, je prends ! J'avais abandonné après avoir trouvé "\(\h*(\H+)\h*\)", en essayant de découper en plusieurs bouts...

Explication :
[\(,] : Commençant par une parenthèse ouvrante ou une virgule
\h* : Pouvant être suivit d'un nombre indéfini de caractères vides
() : On ne retourne que cette information-là
[^\h,\)]+ : Au-moins un caractère, jusqu'à un espace, une virgule ou une parenthèse fermante.

J'ai noté le sujet Résolu, merci mille fois pour cette RegExp !

Note : attention, cette RegExp ne permet pas de gérer des chaînes de caractères exotiques contenant des virgules ou parenthèses fermantes, genre $Key[0] = maFonction('Ceci me va,', "explication : (non)").
P.S : J'ai ajouté la recherche de \h dans le groupement cité, car les espaces de fin de paramètre ne doivent pas être retournés.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] StringRegExp() pour extraire plusieurs paramètres

#6

Message par mikell »

Dinosaure a écrit :P.S : J'ai ajouté la recherche de \h dans le groupement cité, car les espaces de fin de paramètre ne doivent pas être retournés.
ça ira seulement si la chaîne à récupérer ne contient pas d'espace
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [R] StringRegExp() pour extraire plusieurs paramètres

#7

Message par jguinch »

Dinosaure a écrit :cette RegExp ne permet pas de gérer des chaînes de caractères exotiques contenant des virgules ou parenthèses fermantes
Ah bin non c'est sûr... Ca aurait été bien de le dire dès le début.

Essai un truc comme ça :
► Afficher le texte
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] StringRegExp() pour extraire plusieurs paramètres

#8

Message par mikell »

"maFonction(une chaine, c'est cool, 'Ceci me va,', ""explication : (non)"", chaine normale)"
Le premier script venu verra 6 paramètres à cette fonction (ou plantera) :P
Je te mets au défi de trouver une quelconque fonction AutoIt qui accepte sans broncher un truc pareil...
(Les virgules ou autres seront acceptées dans les paramètres s'il y a des guillemets)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Dinosaure
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 06 oct. 2011 16:36
Status : Hors ligne

Re: [R] StringRegExp() pour extraire plusieurs paramètres

#9

Message par Dinosaure »

La première partie de mon idée a été répondue... La deuxième partie aurait été de remplacer an, b, c, d depuis mafonction(an, b , c,d ) par le contenu de mafonction(une chaine, c'est cool, 'Ceci me va,', ""explication : (non)"").
Les espace ne devant pas être acceptés si ils ne sont pas entre guillemets / apostrophes.

Je n'espérais pas une réponse si rapide, merci !! La réponse convenait totalement à ce que j'avais demandé en premier, la petite note étant une simple précision... Maintenant, ça va devenir totalement exploitable !
Répondre