![]() |
Regex geht nicht mehr?
Hallo ich bin es mal wieder! :lol:
Delphi-Quellcode:
So also mein Problem ist das wenn der Reguläre ausdruck korrekt ist macht er ein "Zugriffsverletzung" in der Klasse EAccessViolation :?:... 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; ... 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: ) |
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". |
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 |
Re: Regex geht nicht mehr?
wie kann ich die länge eines arrays bestimmen?
Delphi-Quellcode:
length(code) //stimmt ja nicht
|
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.
|
Re: Regex geht nicht mehr?
Delphi-Quellcode:
danke für die tipps
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; 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? |
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:
[edit] Schreibfehler [/edit]
with TPerlRegEx.Create(nil) do
try //Code finally Free; end; |
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: ). |
Re: Regex geht nicht mehr?
Delphi-Quellcode:
Ohne "-1". Das Array hat eine Länge von "SubExpressionCount" und der Indizierung geht von 0 an bis SubExpressionCount - 1. (Genauso wie bei SubExpressions[]).
setlength(code,SubExpressionCount);
|
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 10:47 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