Una función que usa comodines (? y *) para comparar cadenas (strings)

Una función Like simple (compara una cadena con un patrón)

Copyright © 2000 Ernesto De Spirito

SMImport - Componentes VCL nativos para importar datos

Like (como)

Hay veces que necesitamos saber si una cadena concuerda con un patrón, que es otra cadena con caracteres comodines (por ejemplo ? y *). Para este propósito puede usar la función MatchesMask declarada en la unidad Masks, pero aquí como un ejemplo académico y porque creemos que puede ser útil en ciertos casos (por ejemplo cuando no quiere conjuntos) hemos implementado una función de reemplazo que devuelve True si la cadena coincide con el patrón y False en caso contrario.

uses SysUtils;

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;

Llamada de ejemplo

if Like('Walter', 'WA?T*') then
  ShowMessage('¡Funcionó!');

Si quiere ver otro ejemplo, usamos esta función para determinar si el nombre de un archivo concuerda con una especificación.

JfControls Library - para Delphi y C++ Builder