Folgende Funktion habe ich vor Jahren hier in der Delphi-Praxis gefunden. Sie arbeitet mit Wildcards (*). Funktioniert tadellos. Kannst du das brauchen?
Delphi-Quellcode:
// Like: Code by Michael Winter
function Like(AText: string; APattern: string): Boolean;
var
StringPtr, PatternPtr: PChar;
StringRes, PatternRes: PChar;
begin
Result := False;
StringPtr := PChar(AText);
PatternPtr := PChar(APattern);
StringRes := nil;
PatternRes := nil;
repeat
repeat // ohne vorangegangenes "*"
case PatternPtr^ of
#0: begin
Result := StringPtr^=#0;
if Result or (StringRes = nil) or (PatternRes = nil) then
Exit;
StringPtr := StringRes;
PatternPtr := PatternRes;
Break;
end;
'*': begin
inc(PatternPtr);
PatternRes := PatternPtr;
Break;
end;
'?': begin
if StringPtr^=#0 then
Exit;
inc(StringPtr);
inc(PatternPtr);
end;
else begin
if StringPtr^=#0 then
Exit;
if StringPtr^<>PatternPtr^ then begin
if (StringRes = nil) or (PatternRes = nil) then
Exit;
StringPtr := StringRes;
PatternPtr := PatternRes;
Break;
end
else begin
inc(StringPtr);
inc(PatternPtr);
end;
end;
end;
until False;
repeat // mit vorangegangenem "*"
case PatternPtr^ of
#0: begin
Result := True;
Exit;
end;
'*': begin
inc(PatternPtr);
PatternRes := PatternPtr;
end;
'?': begin
if StringPtr^=#0 then
Exit;
inc(StringPtr);
inc(PatternPtr);
end;
else begin
repeat
if StringPtr^=#0 then
Exit;
if StringPtr^=PatternPtr^ then
Break;
inc(StringPtr);
until False;
inc(StringPtr);
StringRes := StringPtr;
inc(PatternPtr);
Break;
end;
end;
until false;
until false;
end;
Aufruf:
Delphi-Quellcode:
Text := 'Hallo Welt. Wie geht es dir?';
Suche := '*Welt*';
if Like(Text, Suche) then
// ...