Page 1 sur 1

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

Posté : lun. 29 juin 2015 13:34
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 ? :)

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

Posté : lun. 29 juin 2015 13:55
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 ")"

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

Posté : lun. 29 juin 2015 14:07
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 ?

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

Posté : lun. 29 juin 2015 14:31
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)

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

Posté : mar. 30 juin 2015 11:10
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.

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

Posté : mar. 30 juin 2015 13:42
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

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

Posté : mar. 30 juin 2015 14:11
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

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

Posté : mar. 30 juin 2015 21:57
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)

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

Posté : mer. 01 juil. 2015 09:16
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 !