![]() |
String nach Wort durchsuchen
Hi,
ich habe eine lange Zeichenkette und suche nach einem bestimmten Wort (oder halt einer Zeichenkette). Ich hab das mal so realisiert und wollt fragen, ob man das so machen kann...
Delphi-Quellcode:
Also man übergibt der Funktion zwei Strings. Die längere Zeichenkette wird dann
function vgl (str1, str2 : string): boolean;
var s, s2 : string; x, richtig, i, o : integer; uebereinstimmung : boolean; begin if gks = false then begin // Wenn gks = false, dann wird der Text in Großbuchstaben umgewandelt str1 := Uppercase (str1); str2 := Uppercase (str2); end; vgl := false; if str1 = str2 then begin result := true; exit; end; if length(str2) > length(str1) then begin s := str1; str1 := str2; str2 := s; end; { str1 ist die längere satzkette } s := ''; i := -1; // Wenn Vgl.String > Org.String ist, keine Übereinstimmung mehr möglich uebereinstimmung := false; while (i <= length(str1)) and (i <= length(str1)-length(str2)) and (uebereinstimmung = false) do begin inc (i); o := 0; richtig := 0; for o := 0 to length(str2)-1 do begin if (str1[i+o] = str2[1+o]) then inc (richtig); if richtig = length(str2) then uebereinstimmung := true; end; end; if uebereinstimmung = true then result := true; end; Zeichen für Zeichen mit Zeichen der kürzeren Zeichenkette verglichen. |
Re: String nach Wort durchsuchen
Hallo devnull,
ich habe mir Deine Funktion nur bis zu den ersten vier Zeilen angesehen, sorry. Zunächst einmal solltest Du bei Parametern, die Du als groß empfindest und innerhalb von Routinen keine Änderung an ihnen vornimmst, das Schlüsselwort const verwenden (Strings bilden hier zwar bedingt eine Ausnahme, es schadet aber auch dort nicht). Dann reicht ein UpperCase nicht aus, um die Groß-/Kleinschreibung zu ignorieren, weil Umlaute von ihr nicht betrachtet werden. Darüber hinaus gibt es bereits die Funktion Pos die einen Teilstring in einem anderen sucht. Statt nun
Delphi-Quellcode:
als eigentlichen Vergleich zu verwenden, bietet sich die Routine AnsiContainsText aus StrUtils an.
Pos(AnsiUpperCase(AString), AnsiUpperCase(ASubString))
Die Lösung Deines Problems könnte also wie folgt vereinfacht lauten:
Delphi-Quellcode:
Die Fallunterscheidung nach der Länge wird ohnehin innerhalb von AnsiContainsText vorgenommen...
function ASuitableName(const AString, AnotherString: string): Boolean;
begin Result:= AnsiContainsText(AString, AnotherString) or AnsiContainsText(AnotherString, AString); end; Für die Unterscheidung ob CaseInsensitiv oder CaseSensitiv bietet sich ein zusätzlicher (optionaler) Parameter an, damit Du die Funktion auch in anderen Projekten verwenden kannst, also zB
Delphi-Quellcode:
bzw wenn Du zunächst zwei separate Funktionen ASuitableNameStr und ASuitableNameText erstellst, die case-sensitiv bzw. case-insensitiv sind, sogar nocht etwas übersichtlicher in der Form
function ASuitableName(const AString, AnotherString: string;
const ACaseSensitiv: Boolean=True): Boolean; begin if ACaseSensitiv then Result:= AnsiContainsStr(AString, AnotherString) or AnsiContainsStr(AnotherString, AString) else Result:= AnsiContainsText(AString, AnotherString) or AnsiContainsText(AnotherString, AString) end;
Delphi-Quellcode:
Aufgerufen werden kann die Funktion dann zB in der Form
function ASuitableName(const AString, AnotherString: string;
const ACaseSensitiv: Boolean=True): Boolean; begin if ACaseSensitiv then Result:= ASuitableNameStr(AString, AnotherString) else Result:= ASuitableNameText(AString, AnotherString) end;
Delphi-Quellcode:
bzw
Result:= ASuitableName('abcde', 'cd');
Delphi-Quellcode:
Result:= ASuitableName('CD', 'aBcDeF', False);
|
Re: String nach Wort durchsuchen
Wenn du einen String in einem String suchen willst dann würde ich auf die interne Funktion Pos zurückgreifen
Delphi-Quellcode:
Sie gibt die Stelle zurück an der die Zeichenkette "zk" in der Zeichenkette "gesamt" beginnt.
function Pos (zk, gesamt :string) :integer;
Wenn "zk" in gesamt nicht vorkommt , wird 0 zurückgegeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 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 by Thomas Breitkreuz