2005. szeptember 17., szombat
Determining if a string matches a pattern with wildcards ('?' and '*')
Problem/Question/Abstract:
Is there a LIKE function in Delphi that compares a string with a pattern?
Answer:
Solve 1:
Sometimes we need to know if a string matches a pattern, which is a string with wildcards (for example '?' and '*'). Here we implement a function that returns True if the string matches the pattern and False if not.
function Like(AString, Pattern: string): boolean;
var
i, n, n1, n2: integer;
p1, p2: pchar;
label
match, nomatch;
begin
AString := UpperCase(AString);
Pattern := UpperCase(Pattern);
n1 := Length(AString);
n2 := Length(Pattern);
if n1 < n2 then
n := n1
else
n := n2;
p1 := pchar(AString);
p2 := pchar(Pattern);
for i := 1 to n do
begin
if p2^ = '*' then
goto match;
if (p2^ <> '?') and (p2^ <> p1^) then
goto nomatch;
inc(p1);
inc(p2);
end;
if n1 > n2 then
begin
nomatch:
Result := False;
exit;
end
else if n1 < n2 then
begin
for i := n1 + 1 to n2 do
begin
if not (p2^ in ['*', '?']) then
goto nomatch;
inc(p2);
end;
end;
match:
Result := True;
end;
Sample call
if Like('Walter', 'WA?T*') then
ShowMessage('It worked!');
If you want to see another example, we use this function to determine if a file name matches a specification in the article "Determining if a file name matches a specification" (keyword: MatchesSpec).
Solve 2:
There is a built in Delphi function called MatchesMask(). It takes * , ? and sets as parameters.
{...}
if MatchesMask('Hello World', '[H-K]?????[W-Y]*') then
{...}
if MatchesMask(FileName, '*.exe') then
{...}
Copyright (c) 2001 Ernesto De Spirito
Visit: http://www.latiumsoftware.com/delphi-newsletter.php
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése