Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

regexpr pas si simple que ça

8 views
Skip to first unread message

kurtz le pirate

unread,
Oct 6, 2012, 4:49:06 AM10/6/12
to
bonjour,

j'ai un probl�me avec les regexpr gourmandes.

j'ai des donn�es de cette forme :
#declare elements[1][17][SYMBOLE]="Ne";


le but est de r�cup�rer les indices entre crochets et le texte entre
guillemet.

bien sur l'expression :
(.*)[(\d)][(\d\d)][(.*)]="(.*)"
ne fonctionne pas.


un peux plus �labor� :
(.*?)\[(\d)\]\[(\d\d)\]\[(.*?)\]="(.*)"
ne fonctionne pas mieux

deja, la capture du premier indice ne fonctionne avec
.*?\[(\d)\]



je me perds en peu... enfin, beaucoup !


une petite aide pour m'aider a comprendre ?
merci
--
klp

Benoit Izac

unread,
Oct 6, 2012, 5:17:25 AM10/6/12
to
Bonjour,

le 06/10/2012 � 10:49, kurtz le pirate a �crit dans le message
<kurtzlepirate-EA3...@news-3.proxad.net> :

> j'ai des donn�es de cette forme :
> #declare elements[1][17][SYMBOLE]="Ne";
>
> le but est de r�cup�rer les indices entre crochets et le texte entre
> guillemet.
>
> bien sur l'expression :
> (.*)[(\d)][(\d\d)][(.*)]="(.*)"
> ne fonctionne pas.

Normal puisque [(\d)] est �quivalent � \d

> un peux plus �labor� :
> (.*?)\[(\d)\]\[(\d\d)\]\[(.*?)\]="(.*)"
> ne fonctionne pas mieux

Normal puisque .* veut dire z�ro ou plus de n'importe quoi et lorsque tu
rajoutes ? derri�re, �a veut dire le plus petit de z�ro ou plus soit
z�ro.

.*? = rien (enfin �a marche tout le temps mais �a ne repr�sente rien)
.+? = .

Je pense que tu voudrais plut�t \[([^]]*)\] => je prends tout jusqu'� ce
que je rencontre un ��]��.

--
Benoit Izac

Marc Espie

unread,
Oct 6, 2012, 5:21:03 AM10/6/12
to
In article <kurtzlepirate-EA3...@news-3.proxad.net>,
kurtz le pirate <kurtzl...@yahoo.fr> wrote:
>bonjour,
>
>j'ai un probl�me avec les regexpr gourmandes.
>
>j'ai des donn�es de cette forme :
>#declare elements[1][17][SYMBOLE]="Ne";
>
>
>le but est de r�cup�rer les indices entre crochets et le texte entre
>guillemet.
>
>bien sur l'expression :
> (.*)[(\d)][(\d\d)][(.*)]="(.*)"
> ne fonctionne pas.
>
>
>un peux plus �labor� :
> (.*?)\[(\d)\]\[(\d\d)\]\[(.*?)\]="(.*)"
> ne fonctionne pas mieux
>
>deja, la capture du premier indice ne fonctionne avec
> .*?\[(\d)\]

Ton probleme est mal ficele... tu veux matcher quoi ? parce qu'ici,
ca marche et ca donne le resultat attendu.

Pour le premier .*?, ca va evidemment capturer toute la chaine jusqu'au
premier [: les expressions regulieres, meme minimales, ne reviennent pas
"en arriere": elle sont gloutonnes des le debut.

Je soupconne que tes donnees sont delimitees par des mots.

Essaie un truc comme
\b(\w*?)\[(\d+)\]\[(\d+)\]\[(.*?)\]=\"(.*)\"
ca devrait etre mieux.

si tes donnees ont toujours exactement la meme tete, pense a ancrer
tes expressions des deux cotes, et a mieux preciser ce que tu veux:

^\#declare\s+(\w*)\[(\d+)\]\[(\d+)\]\[(.*?)\]=\"(.*)\"$

Nicolas George

unread,
Oct 6, 2012, 5:29:27 AM10/6/12
to
Benoit Izac , dans le message <87ipaor...@izac.org>, a �crit�:
> Normal puisque .* veut dire z�ro ou plus de n'importe quoi et lorsque tu
> rajoutes ? derri�re, �a veut dire le plus petit de z�ro ou plus soit
> z�ro.

Non, pas forc�ment�: c'est le plus petit parmi ceux qui permettent de
continuer le matching�:

$ perl -e '
$_ = "abc-def-ghi"; s/.*-//; print "$_\n";
$_ = "abc-def-ghi"; s/.*?-//; print "$_\n";
'
ghi
def-ghi

Dans le cas pr�sent, les caract�res suivants sont sans ambigu�t�.

Benoit Izac

unread,
Oct 6, 2012, 5:46:26 AM10/6/12
to
Bonjour,

le 06/10/2012 � 11:29, Nicolas George a �crit dans le message
<506ff9f7$0$1856$426a...@news.free.fr> :
Effectivement, j'ai post� un peu vite et j'ai dit n'importe quoi.

--
Benoit Izac

kurtz le pirate

unread,
Oct 6, 2012, 6:10:33 AM10/6/12
to
In article <k4ot5v$3qt$1...@saria.nerim.net>, es...@lain.home (Marc Espie)
wrote:

> Ton probleme est mal ficele... tu veux matcher quoi ?

--- je m'explique mieux :

� partir de :

#declare elements[1][17][SYMBOLE]="Ne";

je veux recup�rer :

1
17
SYMBOLE
Ne

j'ai continu� mes recherches (avec l'aide de google bien s�r) et j'ai
trouv� �a :

\[(.*?)\]
c'est ok pour les indices entre crochets.


--- le code :

my $t = '#declare elements[1][17][SYMBOLE]="Ne"';

my @result = ($t =~ m/\[(.*?)\]/g);

for(@result) {
print "-> $_\n";
}

--- et j'ai :
-> 1
-> 17
-> SYMBOLE


il faut maintenant que j'arrive � capturer entre des "".



merci

--
klp

Olivier Miakinen

unread,
Oct 6, 2012, 12:10:24 PM10/6/12
to
Le 06/10/2012 12:10, kurtz le pirate a ᅵcrit :
> ᅵ partir de :
>
> #declare elements[1][17][SYMBOLE]="Ne";
>
> je veux recupᅵrer :
>
> 1
> 17
> SYMBOLE
> Ne
>
> [...]
>
> il faut maintenant que j'arrive ᅵ capturer entre des "".

C'est le plus simple, si tu n'as qu'une seule paire de guillemets.
Par exemple : /"(.*)"/

kurtz le pirate

unread,
Oct 7, 2012, 3:13:39 AM10/7/12
to
In article <k4pl49$2isb$1...@cabale.usenet-fr.net>,
Olivier Miakinen <om+...@miakinen.net> wrote:

> Le 06/10/2012 12:10, kurtz le pirate a écrit :
> > à partir de :
> >
> > #declare elements[1][17][SYMBOLE]="Ne";
> >
> > je veux recupérer :
> >
> > 1
> > 17
> > SYMBOLE
> > Ne
> >
> > [...]
> >
> > il faut maintenant que j'arrive à capturer entre des "".
>
> C'est le plus simple, si tu n'as qu'une seule paire de guillemets.
> Par exemple : /"(.*)"/


effectivement, c'est le plus simple.
tout est ok maintenant. ma solution est donc :

my @result = (m/\[(.*?)\]\[(.*?)\]\[(.*?)\]="(.*?)"/);



merci
--
klp
0 new messages