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

Pb avec Regex

9 réponses
Avatar
Cirfain
Bonjour,

Les Regex me posent un probl=E8me en multiligne.

J'ai ecrit un bout de code pour tester, un truc tout bete,=20
3 textbox, 1 pour mon text, 1 pour l'expression, une pour=20
mon r=E9sultat. Je cherche =E0 extraire un morceau de mon text.

voici le texte :
begin
bla
bla
bla
end
begin
bli
bli
bli
bli
end

je cherche =E0 r=E9cup=E9rer ce qu'il y a entre les begins et=20
les ends (begin et end compris).

mon expression : (^begin$*.?^end$) ou (^begin$.*?^end$)
comme option je mets multiligne, mais apparemment rien n'y=20
fait le caract=E8re de d=E9but de ligne et celui de fin de=20
ligne ne sont pas interpret=E9s. J'ai donc test=E9 les options=20
seules et les combinaisons d'options, mais rien n'y fait.

J'ai trouv=E9 ici des "testeurs de regex" (regex-coach, the=20
regulator, expresso). J'ai essay=E9 avec et le r=E9sultat=20
change suivant l'outil !!!

Je n'y comprends plus rien...

Merci pour votre aide.
Cirfain

9 réponses

Avatar
Patrick Philippot
Cirfain wrote:
je cherche à récupérer ce qu'il y a entre les begins et
les ends (begin et end compris).



Bonjour,

begin(.|n)*?end

? pour la correspondance la plus courte possible.

Notez que cette approche est toutefois ambigüe car un "end" entre le
begin et le end peut être légitimement présent (sous-chaîne d'une des
chaînes de la séquence bla bla bla:

begin
my
girl
friend <<<
end

Dans ce cas, il ne va pas être facile d'exclure le "end" de "friend".

Les expressions régulières ont leurs limites et ne peuvent pas remplacer
un bon parsing. Je ne sais pas ce que vous cherchez exactement à parser
mais ce mécanisme ne conviendra pas à un source Pascal ou Delphi ou à un
source .RC par exemple.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Ambassadeur Kosh
une Regex est moins "puissante" qu'un LALR.
maintenant, les regex ont toujours "tendance" à proposer l'expression la
plus longue possible.
alors à part exclure end de l'interieur de la zone, je ne vois pas trop...
et si les niveaux de parantheses se multiplient, n'y songez meme pas.
Avatar
C'est pour cela que j'avais besoin de ^ (debut de ligne)
et du $ (fin de ligne), mais visiblement ça ne marche
pas...

Tant pis, je vais utiliser la bonne vielle méthode de la
lecture ligne à ligne du "begin" jusqu'au "end".

Ca marche déjà ça, mais j'étais persuadé que les regex
pouvais améliorer la rapidité.

Merci pour vos réponses.

A++

-----Message d'origine-----
Cirfain wrote:
je cherche à récupérer ce qu'il y a entre les begins et
les ends (begin et end compris).



Bonjour,

begin(.|n)*?end

? pour la correspondance la plus courte possible.

Notez que cette approche est toutefois ambigüe car


un "end" entre le
begin et le end peut être légitimement présent (sous-


chaîne d'une des
chaînes de la séquence bla bla bla:

begin
my
girl
friend <<<
end

Dans ce cas, il ne va pas être facile d'exclure le "end"


de "friend".

Les expressions régulières ont leurs limites et ne


peuvent pas remplacer
un bon parsing. Je ne sais pas ce que vous cherchez


exactement à parser
mais ce mécanisme ne conviendra pas à un source Pascal ou


Delphi ou à un
source .RC par exemple.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


.



Avatar
julien
Cirfain wrote:
Bonjour,

Les Regex me posent un problème en multiligne.

J'ai ecrit un bout de code pour tester, un truc tout bete,
3 textbox, 1 pour mon text, 1 pour l'expression, une pour
mon résultat. Je cherche à extraire un morceau de mon text.

voici le texte :
begin
bla
bla
bla
end
begin
bli
bli
bli
bli
end

je cherche à récupérer ce qu'il y a entre les begins et
les ends (begin et end compris).

mon expression : (^begin$*.?^end$) ou (^begin$.*?^end$)
comme option je mets multiligne, mais apparemment rien n'y
fait le caractère de début de ligne et celui de fin de
ligne ne sont pas interpretés. J'ai donc testé les options
seules et les combinaisons d'options, mais rien n'y fait.


Bonjour

Je pense que ^correspond au début du "flow": dans le cas du multiligne,
il y a un seul ^ et un seul $. Ligne par ligne, il y a un ^ et un $ poar
ligne.

(n|^)beginn.*nend(n|$) est un début. Mais il va falloir l'améliorer,
car dans votre exemple, ca va prendre tout le texte entre le premier
begin et le dernier end.

Julien
Avatar
Cirfain
Pile poil ce qu'il me fallait !
Il suffit de rajouter un ? derriere le *. pour avoir le
contenu par groupe.

Merci

-----Message d'origine-----
Cirfain wrote:
Bonjour,

Les Regex me posent un problème en multiligne.

J'ai ecrit un bout de code pour tester, un truc tout




bete,
3 textbox, 1 pour mon text, 1 pour l'expression, une




pour
mon résultat. Je cherche à extraire un morceau de mon




text.

voici le texte :
begin
bla
bla
bla
end
begin
bli
bli
bli
bli
end

je cherche à récupérer ce qu'il y a entre les begins et
les ends (begin et end compris).

mon expression : (^begin$*.?^end$) ou (^begin$.*?^end$)
comme option je mets multiligne, mais apparemment rien




n'y
fait le caractère de début de ligne et celui de fin de
ligne ne sont pas interpretés. J'ai donc testé les




options
seules et les combinaisons d'options, mais rien n'y




fait.
Bonjour

Je pense que ^correspond au début du "flow": dans le cas


du multiligne,
il y a un seul ^ et un seul $. Ligne par ligne, il y a un


^ et un $ poar
ligne.

(n|^)beginn.*nend(n|$) est un début. Mais il va


falloir l'améliorer,
car dans votre exemple, ca va prendre tout le texte entre


le premier
begin et le dernier end.

Julien
.



Avatar
Cirfain
Après qq recherches, je me suis rendu compte qu'une petite
chose empechait que tout fonctionne correctement : le "r"
et oui quand on l'enleve, et bien tout va bien...

Voila


-----Message d'origine-----
Bonjour,

Les Regex me posent un problème en multiligne.

J'ai ecrit un bout de code pour tester, un truc tout


bete,
3 textbox, 1 pour mon text, 1 pour l'expression, une pour
mon résultat. Je cherche à extraire un morceau de mon


text.

voici le texte :
begin
bla
bla
bla
end
begin
bli
bli
bli
bli
end

je cherche à récupérer ce qu'il y a entre les begins et
les ends (begin et end compris).

mon expression : (^begin$*.?^end$) ou (^begin$.*?^end$)
comme option je mets multiligne, mais apparemment rien


n'y
fait le caractère de début de ligne et celui de fin de
ligne ne sont pas interpretés. J'ai donc testé les


options
seules et les combinaisons d'options, mais rien n'y fait.

J'ai trouvé ici des "testeurs de regex" (regex-coach, the
regulator, expresso). J'ai essayé avec et le résultat
change suivant l'outil !!!

Je n'y comprends plus rien...

Merci pour votre aide.
Cirfain
.



Avatar
Zazar
Bonjour,

C'est pour cela que j'avais besoin de ^ (debut de ligne)
et du $ (fin de ligne), mais visiblement ça ne marche
pas...



Par défaut, ^ et $ signifient respectivement début et fin de la chaîne
d'entrée, si vous voulez modifier leurs comportements pour qu'ils signifient
debut et fin de ligne, il faut utiliser l'option RegexOptions.Multiline.

--
Zazar
Avatar
Zazar
> Pile poil ce qu'il me fallait !
Il suffit de rajouter un ? derriere le *. pour avoir le
contenu par groupe.



Il y a encore un autre problème avec cette regex, c'est qu'elle ne valide
pas un groupe vide :
begin
end

Si vous voulez réglez ce problème, il faut passer par l'utilisation de ^ et
$.


--
Zazar
Avatar
Cirfain
Ben après recherche, je me suis rendu compte que mes regex
avaient un comportement cohérent quand je vire les r de
mon texte.

Je n'ai rien vu en ce qui concerne les r dans la doc qui
va dans le sens de ce que j'ai fait.

en mettant multiligne ET singleline en option, c'est
royal, tout marche.

Voila.
A+

-----Message d'origine-----
Bonjour,

Les Regex me posent un problème en multiligne.

J'ai ecrit un bout de code pour tester, un truc tout


bete,
3 textbox, 1 pour mon text, 1 pour l'expression, une pour
mon résultat. Je cherche à extraire un morceau de mon


text.

voici le texte :
begin
bla
bla
bla
end
begin
bli
bli
bli
bli
end

je cherche à récupérer ce qu'il y a entre les begins et
les ends (begin et end compris).

mon expression : (^begin$*.?^end$) ou (^begin$.*?^end$)
comme option je mets multiligne, mais apparemment rien


n'y
fait le caractère de début de ligne et celui de fin de
ligne ne sont pas interpretés. J'ai donc testé les


options
seules et les combinaisons d'options, mais rien n'y fait.

J'ai trouvé ici des "testeurs de regex" (regex-coach, the
regulator, expresso). J'ai essayé avec et le résultat
change suivant l'outil !!!

Je n'y comprends plus rien...

Merci pour votre aide.
Cirfain
.