Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TRegex und Capture Groups (https://www.delphipraxis.net/180829-tregex-und-capture-groups.html)

Der schöne Günther 20. Jun 2014 16:16

TRegex und Capture Groups
 
Eine dumme Frage. Ist das normal dass das Pattern an sich auch in der "Capture-Group" mit drinsteckt?

Folgendes Beispiel:
Delphi-Quellcode:
program Project4;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.SysUtils, System.RegularExpressions;

procedure regexTest();
const
   pattern: String = '(?''name''Delphi|C\+\+)-*(?''ort''\w+)';
   subject: String = 'Ich gehe heute in die Delphi-Praxis. Danach auf den Delphischrottplatz. Und vielleicht in die C++-Bar.';
var
   regex: TRegex;
   match: TMatch;
   group: TGroup;
begin
   regex := TRegex.Create(pattern);

   for match in regex.Matches(subject) do begin
      WriteLn('Match: '+match.Value.QuotedString());
      for group in match.Groups do
         WriteLn('  '+group.Value.QuotedString());

      WriteLn('Der Name ist '+match.Groups['name'].Value.QuotedString() );
      WriteLn('Der Ort ist '+match.Groups['ort'].Value.QuotedString() );

      WriteLn(sLineBreak);

   end;

end;

begin
   regexTest();
   ReadLn;
end.
Ergibt:
Code:
Match: 'Delphi-Praxis'
   'Delphi-Praxis'
   'Delphi'
   'Praxis'
Der Name ist 'Delphi'
Der Ort ist 'Praxis'


Match: 'Delphischrottplatz'
   'Delphischrottplatz'
   'Delphi'
   'schrottplatz'
Der Name ist 'Delphi'
Der Ort ist 'schrottplatz'


Match: 'C++-Bar'
   'C++-Bar'
   'C++'
   'Bar'
Der Name ist 'C++'
Der Ort ist 'Bar'
Ich hätte den jeweils ersten Eintrag bei den Gruppen nicht erwartet.

himitsu 20. Jun 2014 16:23

AW: TRegex und Capture Groups
 
Wieso nicht?

Das ist der Treffer für den kompletten Ausdruck
und dann folgen die geklammerten Untergruppen.

Stell dir einfach nochmal eine implizite Klammer/Gruppe, um alles drumrum, vor.
Delphi-Quellcode:
'((?''name''Delphi|C\+\+)-*(?''ort''\w+))';

Es ist praktisch das, was man auch finden würde, wenn in der Anfrage garkeine Klammern vorkommen würden.

Der schöne Günther 20. Jun 2014 16:26

AW: TRegex und Capture Groups
 
Hm weil ich dachte... Der komplette Ausdruck ist der Match selber. Den habe ich ja schon in
Delphi-Quellcode:
Match.Value
. Und die Gruppen darin sind unter
Delphi-Quellcode:
Match.Groups
.

Zitat:

Zitat von himitsu (Beitrag 1263061)
Stell dir einfach nochmal eine implizite Klammer/Gruppe, um alles drumrum, vor.

Verstehen tue ich es, Ich finds nur komisch. Ich wollte nur fragen, ob Delphi (XE5) das so richtig macht. Wenn du sagst das g'hört so, gebe ich mich dem vertrauensvoll hin.

himitsu 20. Jun 2014 16:30

AW: TRegex und Capture Groups
 
Delphi macht hier praktisch garnichts.

Die benutzten einfach einen externen Perl-kompatiblen RegEx-Code und diese sollte schon richtig funktionieren.

Der schöne Günther 20. Jun 2014 16:31

AW: TRegex und Capture Groups
 
Naja, also ich brauche nur das Internet nach Delphi und TRegex zu befragen und finde mehrere Bugs, der letzte Fix grade jetzt in XE6. Mein vollstes Vertrauen habe ich darin nicht unbedingt :angel2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz