Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TRegEx.Matches verhält sich anders als gedacht (https://www.delphipraxis.net/217276-tregex-matches-verhaelt-sich-anders-als-gedacht.html)

Codehunter 4. Jun 2025 06:52

TRegEx.Matches verhält sich anders als gedacht
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo!

Ich habe einen String
Delphi-Quellcode:
'3d 12h'
(3 Tage, 12 Stunden), der eine Zeitspanne repräsentiert. Ich möchte mit TRegEx.Matches prüfen, ob der String das korrekte Format hat und gleichzeitig die beiden numerischen Teile extrahieren. Die Expression
Delphi-Quellcode:
'^([0-9]{1,})d ([0-9]{1,2})h$'
sollte eigentlich genau das tun laut Testtool (Bild 1). Mit dem folgenden Code kommt in Delphi aber was anderes heraus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  X = '3d 12h';
var
  Matches: TMatchCollection;
begin
  Matches := TRegEx.Matches(X, '^([0-9]{1,})d ([0-9]{1,2})h$');
end;
Zwar matcht die Expression wie gedacht und bringt auch drei Groups, jedoch enthalten alle drei Groups den identischen String
Delphi-Quellcode:
'3d 12h'
(siehe Bild 2). Wo ist da jetzt der Denkfehler?

Grüße
Cody

Der schöne Günther 4. Jun 2025 06:55

AW: TRegEx.Matches verhält sich anders als gedacht
 
Ich habe jetzt nicht in die Implementierung geschaut, aber zu dem Match gehört mehr als ein Verweis auf den String: Die beiden Zahlen davor sind wahrscheinlich die "von" und "bis"-Position in diesem String - Und die sehen für mich richtig aus.

Schau dir doch nicht die rohen Daten im Speicher an, sondern lass den Debugger
Delphi-Quellcode:
Matches.Groups[1]
und
Delphi-Quellcode:
[2]
ausgeben.

Codehunter 4. Jun 2025 07:13

AW: TRegEx.Matches verhält sich anders als gedacht
 
Stimmt, du hast recht. Der Denkfehler war, dass TRegEx.Matches den Inputstring gleich zerlegt und im Speicher ablegt. Aber das passiert erst wenn man durchiteriert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  X = '3d 12h';
var
  Matches: TMatchCollection;
  Match: TMatch;
  Group: TGroup;
  V: string;
begin
  Matches := TRegEx.Matches(X, '^([0-9]{1,})d ([0-9]{1,})h$');
  for Match in Matches do begin
    for Group in Match.Groups do begin
      V := Group.Value; // 1. Durchlauf = '3d 12h'  2. Durchlauf = '3'   3. Durchlauf = '12'
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 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-2025 by Thomas Breitkreuz