Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

regexpr pas si simple que ça

7 réponses
Avatar
kurtz le pirate
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

7 réponses

Avatar
Benoit Izac
Bonjour,

le 06/10/2012 à 10:49, kurtz le pirate a écrit dans le message
:

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)][(dd)][(.*)]="(.*)"
ne fonctionne pas.



Normal puisque [(d)] est équivalent à d

un peux plus élaboré :
(.*?)[(d)][(dd)][(.*?)]="(.*)"
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
Avatar
espie
In article ,
kurtz le pirate 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)][(dd)][(.*)]="(.*)"
ne fonctionne pas.


un peux plus élaboré :
(.*?)[(d)][(dd)][(.*?)]="(.*)"
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:

^#declares+(w*)[(d+)][(d+)][(.*?)]="(.*)"$
Avatar
Nicolas George
Benoit Izac , dans le message , 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é.
Avatar
Benoit Izac
Bonjour,

le 06/10/2012 à 11:29, Nicolas George a écrit dans le message
<506ff9f7$0$1856$ :

Benoit Izac , dans le message , 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é.



Effectivement, j'ai posté un peu vite et j'ai dit n'importe quoi.

--
Benoit Izac
Avatar
kurtz le pirate
In article <k4ot5v$3qt$, (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
Avatar
Olivier Miakinen
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 : /"(.*)"/
Avatar
kurtz le pirate
In article <k4pl49$2isb$,
Olivier Miakinen <om+ 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