In meiner Zauberkiste habe ich folgendes gefunden. Es liefert nicht die Position, aber als Ansatz bestimmt baruchbar:
Code:
{ Like prüft die Übereinstimmung eines Strings mit einem Muster.
So liefert Like('Delphi', 'D*p?i') true.
Der Vergleich berücksichtigt Klein- und Großschreibung.
Ist das nicht gewünscht, muss statt dessen
Like(AnsiUpperCase(AString), AnsiUpperCase(APattern)) benutzt werden: }
function Like(const AString, APattern: String): Boolean;
var
StringPtr, PatternPtr: PChar;
StringRes, PatternRes: PChar;
begin
Result:=false;
StringPtr:=PChar(AString);
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; {Michael Winter}