[..] Avoir tous les résultats avec StringRegExp

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

[..] Avoir tous les résultats avec StringRegExp

#1

Message par tolf »

Bonjour,

Dans mon script j'utilise une chaîne de caractères contenant de virgules et je voudrais séparer la chaîne suivant les virgules donc pour le moment pas de problème :

Code : Tout sélectionner

StringSplit($chaine, ",")
seulement voilà je ne voudrais pas que les virgules servent de séparateur quand elles sont entre des guillemets. Je pense donc que la fonction StringRegExp est tout à fait appropriée et voici mon code :

Code : Tout sélectionner

#include <Array.au3>
$resultat = StringRegExp('salut, "bonjour, comment allez vous ?", #00ffff, 354', '[^,"]*("[^"]*")*[^,"]*', 3)
_ArrayDisplay($resultat)
Problème : la table $resultat ne contient que 'salut' alors que je voudrais qu'elle contienne :

salut
"bonjour, comment allez vous ?"
#00ffff
354


a priori, le flag 3 correspond à des résultats globaux donc comment faire ?
Modifié en dernier par tolf le dim. 07 sept. 2008 17:13, modifié 1 fois.
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
moutelous
Niveau 6
Niveau 6
Messages : 229
Enregistré le : sam. 09 févr. 2008 19:51
Localisation : Rennes
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#2

Message par moutelous »

Bonjour tolf,


Pour ma part je m'attends également à trouver toutes les occurrences avec le flag 3, curieux ... avec les quelques tests effectués de mon côté le global s'arrête dès le premier caractère qui ne "match" pas ...

Une petite recherche supplémentaire s'impose ...

A+
A+
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#3

Message par sylvanie »

Bonsoir, l'expression n'est pas bien adaptée :
[^,"]*("[^"]*")*[^,"]*
salut, "bonjour, comment allez vous ?", #00ffff, 354

salut vat matcher avec [^,"]*
mais le reste de la chaîne suivant salut est : ', "bonjour, comment allez vous ?", #00ffff, 354'
et doc à cause de ', ' on s'arrête

pour rendre la recherche générique, on doit donc sélectionner :
tout ce qui ne comporte pas de , ni de "
ou
tout ce qui est de la forme "......."

ie
([^,"]+)
|
(".*")

les () sont très importantes, car elles forcent le regroupement

d'où au final :

Code : Tout sélectionner

#include <Array.au3>
$resultat = StringRegExp('salut, "bonjour, comment allez vous ?", #00ffff, 354', '([^,"]+)|(".*")', 3)
_ArrayDisplay($resultat)
cependant, une lacune dans cette dernière expression persiste : des lignes retournées vide (espaces ?) en trops, d'où un second traitement à faire après pour les éliminer en attendant de poffiner l'expression :
[0]|salut
[1]|
[2]|
[3]|"bonjour, comment allez vous ?"
[4]| #00ffff
[5]| 354
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
moutelous
Niveau 6
Niveau 6
Messages : 229
Enregistré le : sam. 09 févr. 2008 19:51
Localisation : Rennes
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#4

Message par moutelous »

Re ....

En fait l'expression de Tolf est la bonne à un caractère près :

Cette expression match correctement (sous autoit) :

Code : Tout sélectionner

[^,"][color=#FF0000]+[/color]("[^"]*")*[^,"]*
A+
A+
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#5

Message par sylvanie »

bien vu,
d'ailleurs celle-ci du coups suffit :

Code : Tout sélectionner

[^,"]+("[^"]*")*
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
moutelous
Niveau 6
Niveau 6
Messages : 229
Enregistré le : sam. 09 févr. 2008 19:51
Localisation : Rennes
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#6

Message par moutelous »

Ouaip ...
A+
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11793
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#7

Message par Tlem »

Trop fort les expressions régulières.
Je vous envie de les maitriser. :cry:

Sylvanie, un explication détaillée de la dernière solution serait très apprécié. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#8

Message par tolf »

Tlem a écrit :Trop fort les expressions régulières.
Je vous envie de les maitriser. :cry:
J'ai (presque complètement) traduit le fichier texte correspondant à la fonction ici et je pense qu'il serait utile de générer le fichier html et de le mettre sur le forum.
Tlem a écrit :Sylvanie, un explication détaillée de la dernière solution serait très apprécié. :mrgreen:

Code : Tout sélectionner

[^,"]+("[^"]*")*
signifie :
- [^,"] tout caractère autre que virgule et guillemet double
- + répété 1 ou plusieurs fois
- ("[^"]*") un groupe composé d'un guillemet, puis de tout caractère autre que guillemet répété autant de fois que nécessaire, puis d'un guillemet
- * ce groupe étant répété autant de fois que nécessaire
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [R] Avoir tous les résultats avec StringRegExp

#9

Message par sylvanie »

voilà une joile explication, rien à ajouter...
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#10

Message par tolf »

oui mais petit problème : si je ne mets pas d'espace après la virgule aïe aïe aïe :cry: voici le résultat :

chaîne :

Code : Tout sélectionner

 'salut,"bonjour, comment allez vous ?","moi, je vais bien",#00ffff,354'
résultat :

Code : Tout sélectionner

[0]salut
[1]bonjour
[2]","
[3]moi
[4] je vais bien
[5]#00ffff
[6]354
:roll:
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#11

Message par tolf »

ceci est sans doute dû au fait que le premier caractère ( [^,"] = tout caractère autre que virgule et guillemet) doit pouvoir exister en 0 fois (comme au début).
Donc en fait, je pense que le bug du début était dû au fait qu'une chaîne vide correspondait au pattern (car * peut valoir "existant 0 fois").

Donc raisonnons autrement. Le pattern est composé de [^,"] et de ("[^"]*"). Il faut faire figurer les cas de figure suivants :
- le 1er existant 0 fois et le 2ème au moins une fois (pour éviter la chaîne vide) : ("[^"]*")+
- le 1er existant 1 fois ou plus et le 2ème 0 fois : [^,"]+
- les deux existant 1 fois ou plus : [^,"]+("[^"]*")+

donc, en rassemblant les 3 par des |, ça fait le pattern suivant : (("[^"]*")+)|([^,"]+)|([^,"]+("[^"]*")+)

mais il y a des répétition dans les résultats dans ce cas :roll:
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11793
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#12

Message par Tlem »

Les expressions régulières sont souvent très commode pour retrouver un résultat en très peut de ligne de code, mais parfois ce n'est pas si simple et le temps de trouver le bon Pattern on à plus vite fait de faire une fonction simple. :P

Donc comme je suis mauvais en expressions régulières :oops: , je vais proposer une alternative plutôt basique, mais fonctionnelle. 8)
► Afficher le texteDécomposition d'une chaîne
Je pense qu'avec un StringRegExpReplace pour remplacer les virgules hors "" par un | puis un StringRegExp du résultat ce serait plus simple. :lol:

A vous Tolf et Sylvanie ... :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
moutelous
Niveau 6
Niveau 6
Messages : 229
Enregistré le : sam. 09 févr. 2008 19:51
Localisation : Rennes
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#13

Message par moutelous »

Bonjour,
Tlem a écrit :Les expressions régulières sont souvent très commode pour retrouver un résultat en très peut de ligne de code, mais parfois ce n'est pas si simple et le temps de trouver le bon Pattern on à plus vite fait de faire une fonction simple. :P
Mais si, mais si ....

Essayez donc ceci :

Code : Tout sélectionner

[^,"\s]+|("[^"]*")
:P :P

A+
A+
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11793
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#14

Message par Tlem »

Ha vi, ça fonctionne rudement bien (screugneugneu :? ) :D

Manque plus que les explications. :lol:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
moutelous
Niveau 6
Niveau 6
Messages : 229
Enregistré le : sam. 09 févr. 2008 19:51
Localisation : Rennes
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#15

Message par moutelous »

Tlem a écrit :Manque plus que les explications. :lol:
[^,"\s]+ : match avec tout caractère autre que , " ou forme d'espace (\s), répété 1 ou plusieurs fois
|: ou
("[^"]*") :match avec un groupe formé d'un " suivi de tout caractère répété 0 ou plusieurs fois autre qu'un guillemet et terminé par un "

Vouala
A+
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#16

Message par sylvanie »

le pb du \s est qu'il va splitter les mots entre 2 , :

exple :

Code : Tout sélectionner

$resultat = StringRegExp('salut tout le monde,"bonjour, comment allez vous ?","moi, je vais bien",#00ffff,354', '[^,"\s]+|("[^"]*")', 3)
[0]|salut
[1]|tout
[2]|le
[3]|monde
[4]|"bonjour, comment allez vous ?"
[5]|"moi, je vais bien"
[6]|#00ffff
[7]|354

Et si on l'enlève, ça marche , mais on revient à l'expression où il faut dans certains cas écrèmer les lignes "vides" en trops ...
faut voir si dans le besoins initial de Tolf, on peut être dans ce cas de figure.
il est intéressant ce cas ...
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
moutelous
Niveau 6
Niveau 6
Messages : 229
Enregistré le : sam. 09 févr. 2008 19:51
Localisation : Rennes
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#17

Message par moutelous »

Ah ! ben NON

Une des règles majeur du REGEX est d'étudier le fichier à exploiter, je suis donc parti du postulat qu'entre les virgules il n'existe qu'un seul terme (sans espace), si virgule(s) et donc espace(s) existent, c'est une phrase , qui doit donc être mise entre guillemet ! (sinon pourquoi cette différence ?)

Dans ce sens le pattern proposé match bien avec le besoin initial de Tolf .......

Mais bon, on peut changer les règles du jeu, soyons joueur :wink: et essayons d'inclure ces espaces ...
A+
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#18

Message par tolf »

Bon j'ai opté pour la solution de Tlem qui est en fait très bien (j'avais juste un peu la flemme de faire une telle fonction au début en croyant que StringRegExp diminuerait la taille de mon code mais en fait ça me prend plus de temps :mrgreen: ).
J'ai juste un petit peu modifié le code pour que s'il y a un '|' déjà existant, il ne serve pas de séparateur :
► Afficher le texteDécomposition de chaîne modifié
Par contre, j'aimerais bien connaître la solution avec StringRegExp (car elle doit sûrement exister celle-là :evil: ) car elle doit être très intéressante.
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11793
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#19

Message par Tlem »

J'ai pas trop compris la remarque de Sylvanie, car ce pattern [^,"\s]+|("[^"]*") crée bien le tableau comme le souhaite tolf :

Code : Tout sélectionner

[0] salut
[1] "bonjour, comment allez vous ?"
[2] "moi, je vais bien"
[3] #00ffff
[4] 354
et non le résultat présenté par Sylvanie. :shock:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11793
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Avoir tous les résultats avec StringRegExp

#20

Message par Tlem »

@tolf vous pouvez vous simplifier la vie en utilisant comme séparateur une suite de symboles improbable (genre ~#~) et modifier la fonction StringSplit en mettant le flag à 1. 8)

J'ai vu ça en lisant la doc, et ça m'a permis de voir que StringSplit peut splitter une chaîne sur plusieurs caractères en même temps. :roll:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre