 Mirror

Determining if a string matches a pattern with wildcards ('?' and '*') (Views: 101)

 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 SpiritoVisit: http://www.latiumsoftware.com/delphi-newsletter.php

<< Back to main page