1

Hello,

Je seche sur une regex ...

Voici ma string de départ :

{start} 11111111111 {start} 2222222222 {end} 3333333333 {end} {start} 44444444 {/end}

La regex doit capturer le contenu entre {start} et {end}, mais pas si c'est imbriqué. Dans l'exemple il faut donc que capturer 2222222222 et 44444444

Sachant qu'un simple
{start}(.*?){end}

me capture

{start} 11111111111 {start} 2222222222 {end}

t}(.*){end}et avec un {star me capture trop :

{start} 11111111111 {start} 2222222222 {end} 3333333333 {end} {start} 44444444 {/end}

J'ai essayé avec les lookahead/behind, j'y arrive désespérément pas ... alors si qqun a une idée smile

Merci !
avatar
Webmaster et développeur du site. Pour tout probleme ou question envoyez un mini message ou mail.

Suivez l'actualité de tous vos site préférés sur yAronews : http://ns.yaronet.com =)

2

d'après mon cours de langages de l'an dernier, c'est pas possible de faire ça avec des regex sad

on a bien vu en cours qu'on a inventé les grammaires hors contexte (yacc/bison) pour pallier à ce "défaut" des expressions régulières.

Ton pb est le même que parser un programme c avec des accolades {} ou du pascal begin...end ou du xml, etc... et on peut pas avec des regex; on a même eu la démo matheuse, mais je m'en souviens plus sad

!call Ethaniel pour
--- Call : Ethaniel pour n'existe pas !
confirmer.

3

Vu que les regex simples forment le langage de type 3, et que les langages type 3 ne peuvent pas compter, je crois que ça ne va pas être bien possible...

Après, j'ignore si les regex étendues de Perl/PHP sont plus puissantes que les regex simples, ou si elles ne sont que des facilités d'écriture.

[EDIT: cross grin]
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

4

heu, si tu n'as pas d'accolade dans tes chaines pourquoi tu fais pas ca :

{start}([^{]*){end}
Ancien pseudo : lolo

5

Je sais pas si ca marche, mais naturellement j'aurais fait un truc du genre :
{start}([^{start}]*){end}
( Je ne suis pas sur de la syntaxe, mais je veux dire "tout sauf {start}" )

edit : cross
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

6

si, je peux avoir des accollades, j'ai pas précisé désolé ^^
avatar
Webmaster et développeur du site. Pour tout probleme ou question envoyez un mini message ou mail.

Suivez l'actualité de tous vos site préférés sur yAronews : http://ns.yaronet.com =)

7

bobti89 (./6) :
{start}([^{start}]*){end}


Ne fonctionne pas car ^{start} correspond à "pas {", "pas s", "pas t", etc. donc dès qu'il y aura un de ces caractères dans la string ca matchera pas {start} t {/end} par ex ne passera pas
avatar
Webmaster et développeur du site. Pour tout probleme ou question envoyez un mini message ou mail.

Suivez l'actualité de tous vos site préférés sur yAronews : http://ns.yaronet.com =)

8

squalyl>
Ben non, y a pas besoin de se souvenir de la profondeur puisqu'on veut juste les parenthèses les plus profondes, les regexp sont assez puissantes... (mais si on voulait au contraire les parenthèses les moins profondes ce serait bel et bien impossible oui)

En regexp Perl ça donne :
{start}((?:(?!{start}|{end}).)*){end}

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

9

Pollux (./8) :
{start}((?:(?!{start}|{end}).)*){end}


arf !

j'avais testé des solutions analogue mais j'avais pas combiné le ?: et le ?!

merci ! smile
avatar
Webmaster et développeur du site. Pour tout probleme ou question envoyez un mini message ou mail.

Suivez l'actualité de tous vos site préférés sur yAronews : http://ns.yaronet.com =)

10

[nosmile]
heu, il faudrait pas protéger les accolades, étant donné qu'elles ont une signification en regex ?

\{start\}((?:(?!\{start\}|\{end\}).)*)\{end\}
Ancien pseudo : lolo

11

Un truc comme ça fonctionnerait, mais ça ne permet pas de capturer les '{' à l'intérieur dnc je suppose que ce n'est pas ce que tu veux ^^
{start}([^{]*){end}
Après tu peux faire un truc compliqué mais ça devient assez moche:
{start}(([^{]*({([^s]([^t]([^a]([^r]([^t][^}]?)?)?)?)?)?)?)*){end}
Je n'ai pas testé mais ça devrait fonctionner normalement (à modifier en fonction de ton {start} et {end} réel, bonne chance grin)

[EDIT] :j'ai bougé une parenthèse, c mieux comme ça tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

12

Spipu> start et end ne sont pas des entiers donc c'est pareil, mais oui smile

Golden> si tu mets des trucs optionnels après l'accolade le {start} sera simplement coupé en { s t a r t } et ça sera accepté par ta regexp ^^ je pense que {start}((?:[^{]|{(?:[^s]|s(?:[^t]|t(?:[^a]|a(?:[^r]|r(?:[^t]|t[^}]))))))*?){end} marcherait

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

13