Einzelnen Beitrag anzeigen

Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: String nach einem bestimmten Format durchsuchen

  Alt 23. Mär 2019, 10:40
Folgende Funktion habe ich vor Jahren hier in der Delphi-Praxis gefunden. Sie arbeitet mit Wildcards (*). Funktioniert tadellos. Kannst du das brauchen?
Delphi-Quellcode:
// Like: Code by Michael Winter
function Like(AText: string; APattern: string): Boolean;
var
  StringPtr, PatternPtr: PChar;
  StringRes, PatternRes: PChar;
begin
  Result := False;
  StringPtr := PChar(AText);
  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;
Aufruf:
Delphi-Quellcode:
  Text := 'Hallo Welt. Wie geht es dir?';
  Suche := '*Welt*';
  if Like(Text, Suche) then
    // ...
Andreas Lauß
Blog
  Mit Zitat antworten Zitat