Discussion:
regexpr pas si simple que ça
(trop ancien pour répondre)
kurtz le pirate
2012-10-06 08:49:06 UTC
Permalink
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
2012-10-06 09:17:25 UTC
Permalink
Bonjour,

le 06/10/2012 à 10:49, kurtz le pirate a écrit dans le message
Post by kurtz le pirate
#declare elements[1][17][SYMBOLE]="Ne";
le but est de récupérer les indices entre crochets et le texte entre
guillemet.
(.*)[(\d)][(\d\d)][(.*)]="(.*)"
ne fonctionne pas.
Normal puisque [(\d)] est équivalent à \d
Post by kurtz le pirate
(.*?)\[(\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
Nicolas George
2012-10-06 09:29:27 UTC
Permalink
Post by Benoit Izac
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
2012-10-06 09:46:26 UTC
Permalink
Bonjour,

le 06/10/2012 à 11:29, Nicolas George a écrit dans le message
Post by Nicolas George
Post by Benoit Izac
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
$ 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é.
Effectivement, j'ai posté un peu vite et j'ai dit n'importe quoi.
--
Benoit Izac
Marc Espie
2012-10-06 09:21:03 UTC
Permalink
Post by kurtz le pirate
bonjour,
j'ai un problème avec les regexpr gourmandes.
#declare elements[1][17][SYMBOLE]="Ne";
le but est de récupérer les indices entre crochets et le texte entre
guillemet.
(.*)[(\d)][(\d\d)][(.*)]="(.*)"
ne fonctionne pas.
(.*?)\[(\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+)\]\[(.*?)\]=\"(.*)\"$
kurtz le pirate
2012-10-06 10:10:33 UTC
Permalink
Post by Marc Espie
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
2012-10-06 16:10:24 UTC
Permalink
Post by kurtz le pirate
#declare elements[1][17][SYMBOLE]="Ne";
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
2012-10-07 07:13:39 UTC
Permalink
Post by Olivier Miakinen
Post by kurtz le pirate
#declare elements[1][17][SYMBOLE]="Ne";
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
Loading...