Bonjour,
toujours dans ma periode regexp, j'ai aujourd'hui un nouveau problème surement très bête :
soit un fichier type :
bla bla
blou blou
Je souhaite faire une regexp me permettant d'afficher par exemple :
2 propriétés trouvées :
item1=bla bla
item2=bou blou
Mais je n'arrive pas a faire une regexp universelle détectant que la balise de fin est la meme que la balise d'ouverture
Quelqu'un peut il m'aiguiller ?
Merci
# Mince
Posté par cho7 (site web personnel) . Évalué à 1.
le fichier est de la forme
'<item1'> bla bla '</item1'>
'<item2'> blou blou '</item2'>
[^] # Re: Mince
Posté par cho7 (site web personnel) . Évalué à 1.
(<)(.*)(>)(.*)(</.*)
Mais avec une telle methode, rien n'empeche de mettre une balise de fin correspondante a celle du début, et c'est là tout le problème.
ps: les parenthèses partout c'est pour mieux traiter le résultats des matchs (je n'utilise que le groupe 2 et 4 au final)
[^] # Re: Mince
Posté par aedrin . Évalué à 2.
genre (<)(.*)(>)(.*)(</)\2(>)
cf http://www.bribes.org/perl/docfr/perlretut.html#LDE2F09D8(...)
[^] # Re: Mince
Posté par aedrin . Évalué à 3.
avec juste ceci tu as tout ce que tu veux :
<(.*)>(.*)</\1>
[^] # Re: Mince
Posté par LaBienPensanceMaTuer . Évalué à 2.
<(.*)>(.*)</\1> marche bien aussi :
[binarym@gco]:~% echo "\<item1\>blabla plop\</item1\>" |perl -e 'if(<> =~ /<(.*)>(.*)<\/\1>/){ print "$1 -> $2\n"; }'
item1 -> blabla plop
[binarym@gco]:~% echo "\<item1\>blabla plop\</item3\>" |perl -e 'if(<> =~ /<(.*)>(.*)<\/\1>/){ print "$1 -> $2\n"; }'
[^] # Re: Mince
Posté par daggett . Évalué à 2.
Le ".*" est "greedy" et donc va matcher sur tous les caractères jusqu'en fin de fichier; après, si la regexp se rend compte qu'il lui manque un truc pour s'appliquer au texte fourni, comme le tag fermant, elle va reessayer en allant moins loin.
Donc il serait peut-être plus efficace (d'un point de vue consommation de ressource) d'utiliser ".*?" ("minimal matching") pour le nom du tag et pour le texte entre les tags.
Peut-être même que c'est nécessaire si jamais ton fichier peut réutiliser le même tag:
<item1> toto </item1>
<item2> plop </item2>
<item1> coin </item1>
va matcher "toto </item1> <item2> plop </item2> <item1> coin " avec ".*" et "toto" + "coin" avec ".*?"
(ou pas, selon que tu configure le <> de perl pour traiter ligne par ligne, ou tout le fichier d'un coup)
$ man perlre
"The pattern really, really wants to succeed"
[^] # Re: Mince
Posté par cho7 (site web personnel) . Évalué à 1.
Je plussois activement
[^] # Suggestion
Posté par _alex . Évalué à 1.
A moins que l'ordre soit important que tu ait des cas comme item2 item1 item3 ...
# Ce n'est pas un boulot pour des regexps
Posté par Sisyphe Plâtrier . Évalué à 1.
Si XML est bienvenu : utiliser expat (le plus light) ou une autre API.
Sinon si tu veux persévérer avec des regexps (ton exemple était juste une instance de problème de références arrières), certains moteurs de regexps offrent effectivement ces références arrières ; généralement sous la forme que l'on retrouve dans la partie remplacement : \1 \2 etc.
[^] # Re: Ce n'est pas un boulot pour des regexps
Posté par cho7 (site web personnel) . Évalué à 2.
Et a quoi ca sert de recoder bash en cours ?
Réinventer la roue ca ne sert pas toujours, mais pour apprendre ca aide un peu parfois
[^] # Re: Ce n'est pas un boulot pour des regexps
Posté par Vivi (site web personnel) . Évalué à 1.
# Commentaire supprimé
Posté par Anonyme . Évalué à 1.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 1.
Ce commentaire a été supprimé par l’équipe de modération.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.