AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pos Suche - mehrere Strings

Ein Thema von toms · begonnen am 25. Apr 2006 · letzter Beitrag vom 26. Apr 2006
Antwort Antwort
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#1

Pos Suche - mehrere Strings

  Alt 25. Apr 2006, 19:45
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,
if (pos(a,y) <> 0) and (pos(b,y) <> 0) and (pos(c,y) <> 0) .... then Bräuchte ich eine Funktion wie

Delphi-Quellcode:
function StringStringMultiple(const Source: AnsiString;
  const SearchPatterns: array of AnsiString;
  {CaseSensitive: Boolean = True}): Boolean;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Pos Suche - mehrere Strings

  Alt 25. Apr 2006, 20:03
Was hindert dich daran, deinen ersten Code in den zweiten zu stecken ? Dann hast du doch deine Funktion.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#3

Re: Pos Suche - mehrere Strings

  Alt 26. Apr 2006, 12:06
ähhhm noch nicht, aber so schwer isses ja nicht
Delphi-Quellcode:
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;
[edit=Luckie]Tags gefixt. Mfg, Luckie[/edit]
thanks ._.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Pos Suche - mehrere Strings

  Alt 26. Apr 2006, 12:18
Wortwörtlich war das natürlich nicht gemeint .

PS: Zwei klitzekleine Fehler sind noch drin.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

Re: Pos Suche - mehrere Strings

  Alt 26. Apr 2006, 12:42
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?
Thomas
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: Pos Suche - mehrere Strings

  Alt 26. Apr 2006, 13:18
Hallo,

wenn man meine Funktion anpasst und nur den ersten Teil verwendet, sollte das auch funktionieren.

Ungefähr so:
Delphi-Quellcode:
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;
Gruß
xaromz
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#7

Re: Pos Suche - mehrere Strings

  Alt 26. Apr 2006, 13:38
Zitat von toms:
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?
Ob man nun die Suchstrings einmal (im Ganzen) und dafür im Source mehrfach sucht,
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 ^^
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz