![]() |
Pos Suche - mehrere Strings
Hallo,
Hat jemand schon mal eine Funktion geschrieben, welche in einem Durchgang mehere Substrings in einem String sucht? Falls ein Substring im Suchstring vorkommt, soll die Funktion True zurückgeben. Anstatt dies schreiben zu müssen,
Delphi-Quellcode:
Bräuchte ich eine Funktion wie
if (pos(a,y) <> 0) and (pos(b,y) <> 0) and (pos(c,y) <> 0) .... then
Delphi-Quellcode:
function StringStringMultiple(const Source: AnsiString;
const SearchPatterns: array of AnsiString; {CaseSensitive: Boolean = True}): Boolean; |
Re: Pos Suche - mehrere Strings
Was hindert dich daran, deinen ersten Code in den zweiten zu stecken :gruebel: ? Dann hast du doch deine Funktion.
|
Re: Pos Suche - mehrere Strings
ähhhm noch nicht, aber so schwer isses ja nicht :zwinker:
Delphi-Quellcode:
[edit=Luckie]Tags gefixt. Mfg, Luckie[/edit]
function StringStringMultiple(Source: AnsiString;
Const SearchPatterns: array of AnsiString; CaseSensitive: Boolean = True): Boolean; var i: Integer; begin Result := False; if CaseSensitive then Source := AnsiLowerCase(Source); for i := 0 to High(SearchPatterns) do if (CaseSensitive and (Pos(AnsiLowerCase(SearchPatterns[i]), Source) <> 0)) or (not CaseSensitive and (Pos(SearchPatterns[i], Source) <> 0)) then begin Result := True; Exit; end; end; thanks ._. |
Re: Pos Suche - mehrere Strings
Wortwörtlich war das natürlich nicht gemeint ;) .
PS: Zwei klitzekleine Fehler sind noch drin. |
Re: Pos Suche - mehrere Strings
Wäre es nicht schneller, wenn der ganze String nur einemal Zeichen für Zeichenn durchlaufen wird und
jeweils überprüft, ob die Substrings vorkommen? |
Re: Pos Suche - mehrere Strings
Hallo,
wenn man meine ![]() Ungefähr so:
Delphi-Quellcode:
Gruß
function FindMultiple(const Source: AnsiString;
const Patterns: array of AnsiString; CaseSensitive: Boolean = True): Boolean; type TPattern = record S: AnsiString; L: Integer; end; var C: Integer; FPatterns: array of TPattern; PatternCount: Integer; PNum: Integer; SourceLength: Integer; SearchSource: AnsiString; begin // Is there anything to find at all? if (Source = '') or (Length(Patterns) = 0) then begin Result := False; Exit; end; PatternCount := Length(Patterns); SetLength(FPatterns, PatternCount); for C := 0 to PatternCount - 1 do begin if CaseSensitive then FPatterns[C].S := Patterns[C] else FPatterns[C].S := AnsiLowerCase(Patterns[C]); FPatterns[C].L := Length(Patterns[C]); end; if CaseSensitive then SearchSource := Source else SearchSource := AnsiLowerCase(Source); Result := True; try SourceLength := Length(Source); C := 1; while C <= SourceLength do begin for PNum := 0 to PatternCount - 1 do begin // Check first char before we waste a jump to CompareMem if (SearchSource[C]) = (FPatterns[PNum].S[1]) then begin if CompareMem(@SearchSource[C], @FPatterns[PNum].S[1], FPatterns[PNum].L) then Exit; end; end; Inc(C); end; finally // Clean up Finalize(FPatterns); end; Result := False; end; xaromz |
Re: Pos Suche - mehrere Strings
Zitat:
oder die Suchstrings mehrfach (Zeichen für Zeichen) und dafür den Source nur einmal sollte eigentlich im Großen und Ganzen egal sein. @xaromz es kann ja mal jemand Testen, aber da ich abgesehn von AnsiLowerCase keine weißeren speicherverändernten Operationen ausführe (in Bezug auf die Strings), sollte meines wohl etwas schneller sein ^^ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz