Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TRegExpr begrenzt nicht (https://www.delphipraxis.net/134988-tregexpr-begrenzt-nicht.html)

TheMiller 2. Jun 2009 21:39


TRegExpr begrenzt nicht
 
Hallo,

ich möchte einen Text (siehe unten) in verschiedene Teile zerlegen. Ich habe mir eine Mini-Expr. gebastelt (zum Test). Diese enthält eine Gruppe zwischen zwei festen Zeichen-Gruppen:

Code:
pntext\\f0\s(.+)\\tab
An das, was in den Klammern ist, möchte ich ran! Problem ist jetzt, dass diese Art von Zeilen beliebig oft vorkommen. Und die RegExpr-Engine macht folgendes: Sie packt von Fundstelle-1 alles bis zur letzten Fundstelle in ein Match, egal ob diese Fundstellen öfter vorkommen. Hier mal mit Text und Result:

Text:

Code:
{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil Tahoma;}{\f1\fnil\fcharset0 Tahoma;}}
\viewkind4\uc1\pard\f0\fs16 RichEdit1
\par \pard{\pntext\f0 A.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart0\pnucltr{\pntxta.}}
\f1 asdasd\f0 
\par \pard{\pntext\f0 I.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart1\pnucrm{\pntxta.}}
\li200\f1 asdsad\f0 
\par \pard{\pntext\f0 1.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart1\pndec{\pntxta.}}
\li400\f1 asdasd\f0 
\par \pard{\pntext\f0 a)\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart1\pnlcltr{\pntxta)}}
\li600\f1 asdasd\f0 
\par }
Result:

Code:
A.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart0\pnucltr{\pntxta.}}
\f1 asdasd\f0 
\par \pard{\pntext\f0 I.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart1\pnucrm{\pntxta.}}
\li200\f1 asdsad\f0 
\par \pard{\pntext\f0 1.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart1\pndec{\pntxta.}}
\li400\f1 asdasd\f0 
\par \pard{\pntext\f0 a)
gewünschtes Ergebnis:

A.
B.
C.
usw.


Was mache ich falsch? Die Quelle ist übrigens eine RTF (aus Richedit), welche in einem StringStream für RegExp gespeichert ist.

[EDIT]Speichere ich den StringStream wiederum in einem Memo und gehe dann in einer Schleife Zeile für Zeile durch, funktioniert das perfekt... Möchte aber ungerne einen StringStream und dann auch noch eine StringList benutzen... [/EDIT]

Bitte um Hilfe!

ULIK 2. Jun 2009 21:55

Re: TRegExpr begrenzt nicht
 
Hi,

das Ergebnis ist völlig korrekt (da die RegExp anscheinend im 'gefrässigen' (greedy) Modus arbeitet): finde etwas was mit pntext beginnt, gefolgt von \f0 gefolgt von einem Whitespace gefolgt von mindestes einem beliebigen Zeichen gefolgt von eine \tab. Dein Ergebnis ist der maximal mögliche Treffer! Schau mal, ob die Engine einen Schalter hat, mit dem man den Greedy-Mode ausschalten kann.

Probier's mal mit
Code:
pntext\\f0\s(.+?)\\tab
Grüße,
Uli

TheMiller 2. Jun 2009 21:57

Re: TRegExpr begrenzt nicht
 
Nein :wall:

Ja, die Engine hat diesen Schalter, ich vergesse ihn immmer und immer wieder!

Ich danke dir - Funktioniert natürlich!!!

Danke! :bouncing4:

omata 3. Jun 2009 00:18

Re: TRegExpr begrenzt nicht
 
Eine andere Variante wäre folgender Schalter...
Delphi-Quellcode:
RegExpr.ModifierG:=false;

TheMiller 3. Jun 2009 00:21

Re: TRegExpr begrenzt nicht
 
Ja, den habe ich letztenende gesetzt ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz