OVH Cloud OVH Cloud

Regexp pour langage balisé

3 réponses
Avatar
Vincent LE LIGEOUR
Bonjour,

Je cherche un moyen d'effectuer une recherche/remplacement a l'aide de
regexp sur un langage balisé. Comment puis-je faire ?

Mon problème est que je ne peux pas matcher à la fois
[tag][tag]toto[/tag][/tag] et [tag]toto[/tag][tag]toto[/tag], l'un des
deux passe forcément a la trappe selon la 'gourmandise' donné.

Des idées des suggestions ? (non, je prefererais ne pas utiliser un
parseur maison ou un parseur xml/html)

Vincent

3 réponses

Avatar
Denis -esp2008-
Bonjour,

Mon problème est que je ne peux pas matcher à la fois
[tag][tag]toto[/tag][/tag] et [tag]toto[/tag][tag]toto[/tag], l'un des
deux passe forcément a la trappe selon la 'gourmandise' donné.


La réponse est dans la perlfaq6, traduite sur
http://www.enstimac.fr/Perl/DocFr/perlfaq6.html

Il faut utiliser le modificateur '?' sur les opérateurs.

Bonne chance,

--
Denis

Avatar
Jérémy JUST
On Wed, 29 Sep 2004 18:57:08 +0200
Denis -esp2008- wrote:

Mon problème est que je ne peux pas matcher à la fois
[tag][tag]toto[/tag][/tag] et [tag]toto[/tag][tag]toto[/tag], l'un
des deux passe forcément a la trappe selon la 'gourmandise' donné.



Que veux-tu reconnaître dans chacun des cas?

Si tes cibles sont:
[tag][tag]toto[/tag][/tag] et [tag]toto[/tag][tag]toto[/tag]
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
tu peux utiliser une forme:
m:[tag][^[]]*?[/tag]:
dans laquelle tu interdis les caractères [ et ] entre les deux balises
que tu vises.


Si tu veux matcher autrement, regarde ce document très complet:
http://www.enstimac.fr/~vanouden/info/regexp_tutorial.pdf

L'opérateur (?! ) peut peut-être t'être utile pour empêcher certains
matches.


Il faut utiliser le modificateur '?' sur les opérateurs.


Je crois que Vincent en était conscient, puisqu'il parle de
« gourmandise ».

--
Jérémy JUST


Avatar
Paul Gaborit
À (at) Wed, 29 Sep 2004 16:59:31 +0200,
Vincent LE LIGEOUR écrivait (wrote):
Je cherche un moyen d'effectuer une recherche/remplacement a l'aide de regexp
sur un langage balisé. Comment puis-je faire ?

Mon problème est que je ne peux pas matcher à la fois
[tag][tag]toto[/tag][/tag] et [tag]toto[/tag][tag]toto[/tag], l'un des deux
passe forcément a la trappe selon la 'gourmandise' donné.

Des idées des suggestions ? (non, je prefererais ne pas utiliser un parseur
maison ou un parseur xml/html)


Extrait de perlfaq6 :

Historically, Perl regular expressions were not capable of matching
balanced text. As of more recent versions of perl including 5.6.1
experimental features have been added that make it possible to do this.
Look at the documentation for the (??{ }) construct in recent perlre
manual pages to see an example of matching balanced parentheses. Be
sure to take special notice of the warnings present in the manual
before making use of this feature.

CPAN contains many modules that can be useful for matching text depend-
ing on the context. Damian Conway provides some useful patterns in
Regexp::Common. The module Text::Balanced provides a general solution
to this problem.


Donc, utilisez soit les constructions (??{ }) des regexps soit
Text::Balanced...

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>