AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TRegEx.Matches verhält sich anders als gedacht

Ein Thema von Codehunter · begonnen am 4. Jun 2025 · letzter Beitrag vom 4. Jun 2025
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.291 Beiträge
 
Delphi 12 Athens
 
#1

TRegEx.Matches verhält sich anders als gedacht

  Alt 4. Jun 2025, 06:52
Hallo!

Ich habe einen String '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 '^([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 '3d 12h' (siehe Bild 2). Wo ist da jetzt der Denkfehler?

Grüße
Cody
Angehängte Grafiken
Dateityp: jpg Bild 1.jpg (64,4 KB, 24x aufgerufen)
Dateityp: png Bild 2.png (18,6 KB, 27x aufgerufen)
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.209 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: TRegEx.Matches verhält sich anders als gedacht

  Alt 4. Jun 2025, 06:55
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 Matches.Groups[1] und [2] ausgeben.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.291 Beiträge
 
Delphi 12 Athens
 
#3

AW: TRegEx.Matches verhält sich anders als gedacht

  Alt 4. Jun 2025, 07:13
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;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 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