Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Unit ApproxStrUtils (https://www.delphipraxis.net/113718-unit-approxstrutils.html)

Gausi 13. Mai 2008 16:20


Unit ApproxStrUtils
 
Liste der Anhänge anzeigen (Anzahl: 2)
ApproxStrUtils
Version 0.1

Diese Unit stellt einige Funktionen bereit, mit deren Hilfe man einen String in einem anderen suchen kann. Das geht mit Pos, PosEx, AnsiContainsStr, und dem ganzen Krempel. Klar, kein Problem. 8)

Aber was macht man, wenn man auch ein paar Rechtschreibfehler erlauben will? Man sucht z.B. nach "Schifffahrt", aber der Text, in dem gesucht wird, benutzt die alte Rechtschreibung, so dass immer nur von "Schiffahrt" die Rede ist? Dann ist man hiermit genau richtig.

Diese Unit stellt einige Funktionen bereit, mit denen ein Text nach einem Muster abgesucht wird, wobei eine gewisse Anzahl von Fehlern erlaubt ist. Ein "Fehler" ist dabei:
  • Ein Einfügen eines Zeichens
  • Ein Entfernen eines Zeichens
  • Ein Ändern eines Zeichens
Für die Informatiker: Hier gehts also um die Edit- oder Levenshtein-Distanz.

Folgende Funktionen werden bereitgestellt:

Delphi-Quellcode:
function ApproxDistance(const AText, AOther: string): Integer;
Berechnet die Edit-Distanz der beiden Strings.

Delphi-Quellcode:
function ApproxResemblesText(const AText, AOther: string; MaxError: Integer = 1): Boolean;
Bestimmt, ob der eine String ähnlich zu dem anderen gemäß der Edit-Distanz ist.

Delphi-Quellcode:
function ApproxContainsStr(const AText, ASubText: string; MaxError: Integer = 1): Boolean;
Bestimmt, ob der Subtext im Text mit höchstens MaxError Fehlern gemäß der Edit-Distanz enthalten ist. Groß- und Kleinschreibung wird berücksichtigt.

Delphi-Quellcode:
function ApproxContainsText(const AText, ASubText: string; MaxError: Integer = 1): Boolean;
Bestimmt, ob der Subtext im Text mit höchstens MaxError Fehlern gemäß der Edit-Distanz enthalten ist. Groß- und Kleinschreibung wird nicht berücksichtigt.

Delphi-Quellcode:
function ApproxPosEx(const AText, ASubText: string; Offset: Integer; Out Count: Integer; MaxError: Integer = 1): Integer;
Gibt den Startindex eines Vorkommens des Subtextes im Text mit höchstens MaxError Fehlern gemäß der Edit-Distanz. Der Text wird ab der Position Offset durchsucht. Der Out-Parameter Count enthält die Länge des gefunden Vorkommens (z.B. zur Benutzung in copy).

Delphi-Quellcode:
function ApproxPos(const AText, ASubText: string; Out Count: Integer; MaxError: Integer = 1): Integer;
Dasselbe wie ApproxPosEx mit Offset=1.

Delphi-Quellcode:
function ApproxBestAppearance(const AText, ASubText: string; out Count, BestError: Integer): Integer;
Liefert den Startindex des ersten Vorkommens mit minimaler Fehlerzahl zurück. Die Out-Parameter Count und BestError geben die Länge des Vorkommens bzw. die Anzahl der Fehler an.

Ich hoffe, ich habe unsinnige Eingaben soweit wie möglich abgefangen, sodass dann trotzdem was halbwegs sinnvolles als Ergebnis geliefert wird. Prinzipbedingt findet ApproxPosEx nicht wirklich alle Vorkommen (wird auch in der Demo klar), aber wenn das gesuchte Wort irgendwo ungefähr auftaucht, dann wird das auch gefunden.

Fehler und Verbesserungsvorschläge sind wie immer willkommen. :D

FAlter 16. Mai 2008 18:26

Re: Unit ApproxStrUtils
 
Hi,

wie wärs mit ner ApproxReplaceStr? Naja, ich brauchs im Moment zwar nicht, aber wäre ne Anregung.

Ansonsten, tolle Unit ;) Ich hab sie in meinem Bot genutzt. Damit er nicht ganz so dumm ist. *g*

Mfg
FAlter

Dezipaitor 16. Mai 2008 19:16

Re: Unit ApproxStrUtils
 
Was ist mit Unicode? :D

Gausi 16. Mai 2008 19:36

Re: Unit ApproxStrUtils
 
Joah, Unicode könnte man auch noch mit reinbringen. Schau ich demnächst mal.

ReplaceStr kann man sich mit dem vorhandenen Rouinen ja zusammenbasteln. Das Problem ist einfach, dass man das Vorkommen nicht so 100%ig definieren kann, bzw. das, was man intuitiv erwarten würde, von Fall zu Fall unterschiedlich ist.

Beispiel: "Altes Papierrzeug gehört in die Papiesammlung", gesucht ist "Papier". Möchte man die Fehler ausmerzen, würde man im ersten Fall "Papierr" finden wollen, und im zweiten "Papie". Von daher macht AprroxReplaceStr nicht wirklich Sinn.

himitsu 17. Mai 2008 19:21

Re: Unit ApproxStrUtils
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also mit unicode würde es mir auch besser gefallen, :angel2:

aber sonst sind es schon hübsche Funktionen :thumb:



nur deine Demo ist etwas "merkwürdig" verschaltet.
Label.OnClick zur Aktualisierung :shock:


'ne einfacher Verbesserung ... hab nicht ständig Lust den UpdateButton, oder auf die Labels zu klicken, nur um die Trackbar-Änderung zu erkennen.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  TBErrorChange(nil);
end;

procedure TForm1.TBErrorChange(Sender: TObject);
begin
  LblError.Caption := 'Max. Fehler: ' + IntToStr(TBError.Position);
  Button1.Click;
end;
mehr siehe Anhang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:00 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