Bonjour, dans un programme, je dois récupérer une chaîne du style :
{value='truc';'machin' ; 'kkhjhj'}
(ne me demandez pas pourquoi ce format bizare)
sachant que je peux avoir n paramètres entres crochets.
Le plus simple est de faire une regexp afin de récupérer truc, machin et kkhjhj.
Le problème est que je sais faire
1- Soit une regexp qui match mais ne capture pas
2- Soit une regexp qui match rarement, mais capture
Je m'explique
dans le cas 1, j'utilise la regexp {value=(?:\s*'(\w+)'\s*(?:;|}))*
J'ai alors une capture qui correspond au dernier paramètre, 'kkhjhj'
Dans le cas 2, j'utilise {value='(\w+)'\s*;\s*'(\w+)'\s*;\s*'(\w+)'} et là j'ai mes captures qui vont bien, mais le problème est que je dois connaître à l'avance le nombre de paramètre.
Comment faire pour avoir le beurre et l'argent du beurre, ie. traiter un nombre indéterminé de paramètres et les capturer ?
Merci !
# pourquoi tu compliques ?
Posté par Antoine Reilles (site web personnel) . Évalué à 2.
/{(\w+)=([^}])}/
en ajoutant les échappements qui manquent surement
alors $1 contiendra ta valeur, et $2 toutes les valeurs correspondantes.
ensuite, un split sur $2 avec comme séparateur ";" te donnera toutes les valeurs
[^] # Re: pourquoi tu compliques ?
Posté par Ontologia (site web personnel) . Évalué à 1.
{(\w+)=([^}]*)}
et en m'inspirant de l'utile commentaire de jigso, je crois que c'est la moins mauvaise méthode.
Les regexp me déçoivent...
« Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker
# Le plus simple est de...
Posté par jigso . Évalué à 4.
Les regexp, c'est bien, sauf quand ça marche pas... Et en l'occurrence, il est préférable d'utiliser un vrai parser.
Extrait de perldoc :
# avec awk:
Posté par totof2000 . Évalué à 2.
echo "{value='truc';'machin' ; 'kkhjhj'}" | awk -F\; ' {
gsub(/\{|\}/,"",$0)
print "Nombre de parametrs: " NF
for (i=1;i<NF;i++) {
print "Parametre " i " : " $i
}
}'
le résultat:
Nombre de parametrs: 3
Parametre 1 : value='truc'
Parametre 2 : 'machin'
A adapter en fonction des besoins.
# en sed.
Posté par Sebastien MICHEL (site web personnel) . Évalué à 3.
echo "{value='truc'; 'fdsqfsdq'; 'fsfdsq' }" |sed -n "/{value='\w\+'\(\s*;\s*'\w\+'\)\+\s*}/p"
# regex + une ligne de code
Posté par Pooly (site web personnel) . Évalué à 2.
value='truc';'machin' ; 'kkhjhj'
ensuite, un explode PHP ou Perl et une bidouille, et c'est bon !
Avec ce genre de pratique j'ai une moulinette qui parse des fichiers .h avec des structs et des enum sans problème.
# du sed
Posté par gaaaaaAab . Évalué à 1.
echo "{value='truc';'machin' ; 'kkhjhj'}" | sed -e "s/[^']*'\([^']\+\)'*[^']*/\1\n/g"
Cette regex laisse une ligne vide à la fin. Ca doit donc pouvoir encore s'améliorer un chouilla ...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.