Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 30. Jul 2009 22:13


Regex geht nicht mehr?
 
Hallo ich bin es mal wieder! :lol:

Delphi-Quellcode:

...
uses perlregex;

{$R *.dfm}

function verarbeitung(code:array of string;pos:array of integer):string;
var
  i:integer;
begin
for i := 0 to length(code) do
      result := result +  '|' + code[i] + ',';
end;

function regl(subj, expr: string): string;
var
  code:array of string;
  pos:array of integer;
begin
  with TPerlRegEx.Create(nil) do
    begin
      RegEx := expr;
      Subject := subj;

      if Match = false then
        begin                                                                   //
            repeat                                                              //
              code[SubExpressionCount] := SubExpressions[SubExpressionCount];   //geändert!
            until MatchAgain                                                    // aber wo is hier der fehler? 
        end;                                                                    //
        result := verarbeitung(code,pos);                                       //
    end;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
edit1.Text:=regl(edit2.Text,'<*>');           //<-------- Fehler
end;

...
So also mein Problem ist das wenn der Reguläre ausdruck korrekt ist macht er ein "Zugriffsverletzung" in der Klasse EAccessViolation :?:
Gestern abend ging es noch und wo ich dann danach noch was geändert hab (siehe oben)
war es tot!

hab schon die ganze zeit gesucht und hab das auch noch die funktion verklienert aber es geht immer noch nicht!Wo ist der Fehler(hab schon mir eine kleine Fehlerquelle erahnt)?

danke für antworten!

(ich hab garantiert was falsch gemacht :pale: )

mirage228 30. Jul 2009 22:20

Re: Regex geht nicht mehr?
 
SubExpressions dürfte von 0 bis SubExpressionCount - 1 indiziert sein.

Du gibst außerdem das erstellte TPerlRegEx nicht wieder frei, erzeugst also bei jedem Aufruf ein Speicherleck.
Weiterhin sollte man Boolean Werte nicht auf "= False" prüfen, sondern mit "not Wert".

DeddyH 30. Jul 2009 22:30

Re: Regex geht nicht mehr?
 
Ohne die Klasse zu kennen, fällt mir folgendes auf:
- das Integer-Array wird nirgends benutzt.
- die Länge des String-Arrays wird nicht gesetzt (SetLength)
- 0 bis Length kann ja nicht stimmen

Chefx 30. Jul 2009 22:37

Re: Regex geht nicht mehr?
 
wie kann ich die länge eines arrays bestimmen?
Delphi-Quellcode:
 length(code) //stimmt ja nicht

DeddyH 30. Jul 2009 22:40

Re: Regex geht nicht mehr?
 
Doch, Length() gibt Dir die Länge zurück. Aber da dynamische Arrays immer 0-indiziert sind, hat das letzte Element den Index Length - 1. Ich selbst habe mir angewöhnt, über Arrays immer mit Low() und High() zu iterieren, dann kann nichts passieren.

Chefx 30. Jul 2009 22:51

Re: Regex geht nicht mehr?
 
Delphi-Quellcode:
function verarbeitung(code:array of string;pos:array of integer):string;
var
  i:integer;
begin
for i := 0 to high(code) do
      result := result + code[i] + '|' + ',';
end;

function regl(subj, expr: string): string;
var
  code:array of string;
  pos:array of integer;
begin
  with TPerlRegEx.Create(nil) do
    begin
      RegEx := expr;
      Subject := subj;

      if Match then
        begin
            repeat
              setlength(code,SubExpressionCount-1);
              code[SubExpressionCount-1] := SubExpressions[SubExpressionCount-1];
            until MatchAgain
        end;
        result := verarbeitung(code,pos);
      end;
   TPerlRegEx.free;
end;
danke für die tipps
Die pos array will ich dann später noch einbinden.
Hab jetzt soweit alles geändert aber bei den Tperlregex.free will das nicht so gehen. warum?

DeddyH 30. Jul 2009 22:55

Re: Regex geht nicht mehr?
 
Du willst eine Klasse freigeben und keine Instanz. Also brauchst Du entweder eine Variable oder Du schreibst das in der Art
Delphi-Quellcode:
with TPerlRegEx.Create(nil) do
  try
    //Code
  finally
    Free;
  end;
[edit] Schreibfehler [/edit]

Chefx 30. Jul 2009 23:01

Re: Regex geht nicht mehr?
 
so jetzt kommt ein fehler "Fehler bei Bereichsprüfung" in der Gleichen Zeile ?
Was soll den das sein? :gruebel:
Hat das irgend was mit meinem Regulären Ausdruck zu tun?
Ich bin mir eigend lich sicher das dass so richtig ist(denken kann man viel :wink: ).

mirage228 30. Jul 2009 23:05

Re: Regex geht nicht mehr?
 
Delphi-Quellcode:
setlength(code,SubExpressionCount);
Ohne "-1". Das Array hat eine Länge von "SubExpressionCount" und der Indizierung geht von 0 an bis SubExpressionCount - 1. (Genauso wie bei SubExpressions[]).

Chefx 30. Jul 2009 23:09

Re: Regex geht nicht mehr?
 
wenn ich dort das weg mache kommt wieder der feher wie oben? :?:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.
Seite 1 von 4  1 23     Letzte »    

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