Determining if a string matches a pattern with wildcards ('?' and '*') (Views: 29)
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 |