Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Regex geht nicht mehr? (https://www.delphipraxis.net/137903-regex-geht-nicht-mehr.html)

Chefx 31. Jul 2009 00:19

Re: Regex geht nicht mehr?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab mal ein Bild vom Programm gemacht
wenn man auf dem Button Oben Fehler meldung
und unten Warnung beim Erzuegen.

DeddyH 31. Jul 2009 00:22

Re: Regex geht nicht mehr?
 
Setz doch mal einen Breakpoint, steppe durch und nenne mir die Zeile und Routine, in der der Fehler auftritt.

Chefx 31. Jul 2009 00:32

Re: Regex geht nicht mehr?
 
ich hab mal getestet und bin auf diese Zeile gekommen:
Delphi-Quellcode:
54:             code[High(code)] := SubExpressions[High(code)];
55: Breack    until MatchAgain;
Sobald ich den Breackpoint dahinter setze bringt er den fehler wo ich davon ein bild gemacht hab.

DeddyH 31. Jul 2009 00:39

Re: Regex geht nicht mehr?
 
Da ich die Klasse nicht kenne: kann sich SubExpressionCount innerhalb der Schleife ändern? Wenn nicht, setz das SetLength() mal vor die Schleife.

Chefx 31. Jul 2009 00:44

Re: Regex geht nicht mehr?
 
Ne das geht nicht weil ja SubExpressions Die "suchergebnisse" hat und das ist in einem Array gespeichter und ich will Die Daten in ein anderes Array Übertragen.
Hab das trotzdem gemacht funktioniert nicht.

DeddyH 31. Jul 2009 00:44

Re: Regex geht nicht mehr?
 
Da denke ich später nochmal drüber nach, ich muss jetzt in Bett.

Chefx 31. Jul 2009 00:46

Re: Regex geht nicht mehr?
 
ich auch tschau!

ULIK 31. Jul 2009 06:08

Re: Regex geht nicht mehr?
 
Guten Morgen,

Zitat:

Zitat von Chefx

Delphi-Quellcode:

//A fehlerquelle meinermeinung nach
     if Match then
        begin
            repeat
              setlength(code,SubExpressionCount);
              code[High(code)] := SubExpressions[High(code)];
            until MatchAgain;
            result := verarbeitung(code,pos);
            end;
//B Ende

Ohne es selbst getestet zu haben: das Ganze schaut mir ziemlich suspekt aus:
  • Welchen Wert hat SubExpressionCount im Debugger!
  • was soll
    Delphi-Quellcode:
    code[High(code)] := SubExpressions[High(code)];
    eigentlich tun? Entweder ist SubExpressionsCount für jeden Treffer der RegExp neu definiert, dann überschreibst Du Dir aber ständig die Daten. Oder es wird durch das MatchAgain nicht verändert, dann schreibst Du aber immer nur Daten in den letzten Datansatz rein.
  • Was auch immer Du mit dem Pos-Array vor hast: Momentan ist es nicht initialisert!
  • Ist nun eine reine Vermutung, aber kann es sein, daß Du das hier haben willst:
    Delphi-Quellcode:
    SetLength(code, 0); //Array initialisieren
    with TPerlRegEx.Create(nil) do
    ...
    if Match then
      begin
        repeat
          nOldIndex := Length(code); // nOldIndex als integer deklarieren
          setlength(code, nOldIndex + SubExpressionCount); // Treffer um neu gefundene erweitern
          for n := 0 to SubExpressionCount - 1 do
            code[nOldIndex + n] := SubExpressions[n]; // Neue Treffer in das code Array eintragen    
        until not MatchAgain; // und weitersuchen. Abbruch, wenn kein Treffer mehr

        result := verarbeitung(code,pos); // jetzt ALLE Treffer verarbeiten
      end;
    So würde zumindest für mich der Aufbau einer Trefferliste Sinn machen.

Grüße,
Uli

Chefx 31. Jul 2009 16:12

Re: Regex geht nicht mehr?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
SetLength(code, 0); //Array initialisieren
with TPerlRegEx.Create(nil) do
...
if Match then
  begin
    repeat
      nOldIndex := Length(code);
      setlength(code, nOldIndex + SubExpressionCount); // warum dann noch + SubExpressionCount
      for n := 0 to SubExpressionCount - 1 do
        code[nOldIndex + n] := SubExpressions[n]; // warum nicht nur n?     
    until not MatchAgain; // heist das nicht so viel wie nächster treffer  

    result := verarbeitung(code,pos);
  end;
Also würde ich das so Copy/Paste machen dann funktionriet es auch nicht!

Positiv: Es kommt keine Fehlernmeldung
Negativ: Es gib kein Ergebniss!

Also hier mal ein Script das ich unter C# geschrieben hab:
Code:
private void ... ;
{
   MatchCollection mc;
   Match m;
   int[] count = new int[20];
   int[] position = new int[20];

   Regex r = new Regex("{(?<contents>[^}]*)}");
   mc = r.Matches("{Text1} und {Text2}");
      //Suchergebnisse in das vorgegebene Array Speichern
   for (int i = 0; i < mc.Count; i++)
   {
      count[i] = mc[i].Length;
      position[i] = mc[i].Index;
   }
   //auslesen der Arrays
   for (int i = 0; i < mc.Count; i++)
   {
      richTextBox1.Text += "Gefundene Position:" + position[i] + "\n";
      richTextBox1.Text += "Länge vom String:" + count[i] + "\n";
   }
}
Das blöde ist dass das nicht genauso ist wie in Delphi geht! :cry:
Die MatchCollection (ist bestimmt mit in der Subexpressions eingebaut :gruebel: ) ist sehr hilfreich und der ganze aufbau halt!
Aber so funktioiert das ja nicht in delphi!

DeddyH 31. Jul 2009 17:11

Re: Regex geht nicht mehr?
 
Ich denke mal, wenn Du eine for-Schleife nehmen würdest, bekämst Du auch ein Ergebnis.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr.
Seite 3 von 4     123 4      

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