Werden in einem regulären Ausdruck sogenennate "capturing groups" wiederholt, so wird nur der letzte Treffer gespeichert, bspw.
(.{2})+
auf einen string abcd losgelassen ergibt als Gesamtmatch wieder abcd, die erste Gruppe enthält aber nur cd. Das ist nichts delphi-spezifisches, sondern gilt für alle PCRE Implementierungen (es gibt aber durchaus Regex-Implementierungen, die erlauben alle Instanzen der Gruppe zu prüfen, z.B. in .net)
Für das was du erreichen willst, gibt es quasi zwei Möglichkeiten
- in einem ersten Schritt den kompletten Hex-String extrahieren und dann in einem zweiten Schritt in 2er Paare unterteilen
- die Nutzung von \G um nach einem erfolgten Match an der selben Stelle wieder anzusetzen
z.B. so:
Delphi-Quellcode:
program Hello;
uses
System.RegularExpressions;
const
HEX_STR = '$aabbcc';
var
M: TMatch;
begin
M := TRegex.Match(HEX_STR, '(?:^\$?|\G(?!^))([[:xdigit:]]{2})');
while M.Success do
begin
WriteLn(M.Groups[1].Value);
M := M.NextMatch;
end;
ReadLn;
end.
Ich verwende hier die vordefinierte Klasse
[[:xdigit:]]
, die
[a-fA-F0-9]
entspricht. Dein
[a-f,A-F,0-9]
matcht btw. auch Kommas.
Wenn du sicher gehen willst, dass du auch wirklich einen Hex-String mit einer geraden Anzahl von Stelle hast, kann an das Ende des Pattern noch ein
(?=(?:[[:xdigit:]]{2})+$)
.