program Project1;
uses
Classes, SysUtils;
function ExtractParts(s: String; out APrefix: String; out ANumber: Integer): Boolean;
var
numberStr: String;
i: Integer;
begin
numberStr := '';
APrefix := '';
for i:=Length(s) downto 1 do
begin
if s[i] = ' ' then
Continue;
if s[i] in ['0'..'9'] then
numberStr := s[i] + numberStr
else begin
APrefix := trim(copy(s, 1, i));
break;
end;
end;
Result := (APrefix <> '') and TryStrToInt(numberStr, ANumber);
end;
procedure ExpandList(s: String; AList: TStrings);
var
L1, L2: TStrings;
n1, n2: Integer;
prefix1, prefix2: String;
i, j: Integer;
begin
L1 := TStringList.Create;
L2 := TStringList.Create;
try
L1.Delimiter := ';';
L1.StrictDelimiter := true;
L1.DelimitedText := s;
L2.Delimiter := ':';
L2.StrictDelimiter := true;
for i := 0 to L1.Count - 1 do begin
L2.DelimitedText := L1[i];
// single item, e.g. n3
if L2.Count = 1 then begin
AList.Add(trim(L1[i]));
Continue;
end;
// range item, e.g. n3:n6
if L2.Count = 2 then
begin
if ExtractParts(L2[0], prefix1, n1) and
ExtractParts(L2[1], prefix2, n2) and
(prefix1 = prefix2) and (n1 <= n2) then
begin
for j := n1 to n2 do
AList.Add(prefix1 + IntToStr(j));
end else
raise Exception.Create('Incorrect syntax');
Continue;
end;
raise Exception.Create('Incorrect syntax');
end;
finally
L2.Free;
L1.Free;
end;
end;
const
s = 'u1; u2;u5:u8;u10;u20: u22; u27 :u30';
var
L: TStringList;
i: Integer;
begin
WriteLn(s);
L := TStringList.Create;
try
ExpandList(s, L);
for i:=0 to L.Count-1 do
WriteLn(L[i])
finally
L.Free;
end;
ReadLn;
end.