So langsam wird es kompliziert
Probier mal:
Code:
(0|[1-9][\d]*)\h+(?:@?((?<=@)[^@]+(?=@)|(?!@))(?:@\h+)?)(?<Special>FAM[SC]|CHIL)?(?(Special)|(?<NoSpecial>\w+))(?(Special)\h+@([^\v]*|)@|\h*([^\v]*|))
Im Prinzip prüfe ich, ob es einen deiner Specialfälle gibt, dann wird der gematcht - sonst das normale Verfahren. Und das nochmal für den Inhalt. Leider erzeugt Delphi im Match-Objekt einige eigentlich nicht vorhandene Gruppen - ich wüsste auch nicht wie ich die wegkriege. Deswegen mal zur Auswertung ein kleines Konsolenprogramm.
Zum selber durchgucken:
https://regex101.com/r/gL9pX8/3
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
uses
System.SysUtils, RegularExpressions;
const
Sample = '
0 @Reference@ Objekt' + sLineBreak +
'
1 NAME Max /Mustermann/' + sLineBreak +
'
2 DATE 22 APR 2016' + sLineBreak +
'
1 FAMC @I123@' + sLineBreak +
'
1 FAMS @I124@' + sLineBreak +
'
1 CHIL @I125@';
var
Match: TMatch;
begin
try
Match := TRegEx.Match(Sample, '
(0|[1-9][\d]*)\h+(?:@?((?<=@)[^@]+(?=@)|(?!@))(?:@\h+)?)(?<Special>FAM[SC]|CHIL)?(?(Special)|(?<NoSpecial>\w+))(?(Special)\h+@([^\v]*|)@|\h*([^\v]*|))');
while Match.Success
do
begin
if Match.Groups.Count = 7
then
begin
WriteLn('
Number:' + Match.Groups[1].Value);
WriteLn('
Reference:' + Match.Groups[2].Value);
WriteLn('
Object:' + Match.Groups[4].Value);
WriteLn('
Content:' + Match.Groups[6].Value);
end else if Match.Groups.Count = 6
then
begin
WriteLn('
Number:' + Match.Groups[1].Value);
WriteLn('
Reference:' + Match.Groups[2].Value);
WriteLn('
Object:' + Match.Groups[3].Value);
WriteLn('
Content:' + Match.Groups[5].Value);
end else
WriteLn('
Das ist anders :(:' + Match.Groups[0].Value);
WriteLn('
');
Match := Match.NextMatch;
end;
ReadLn;
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
end.