AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Unit ApproxStrUtils
Thema durchsuchen
Ansicht
Themen-Optionen

Unit ApproxStrUtils

Ein Thema von Gausi · begonnen am 13. Mai 2008 · letzter Beitrag vom 17. Mai 2008
Antwort Antwort
Benutzerbild von Gausi
Gausi
Registriert seit: 17. Jul 2005
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:

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

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

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.

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.

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).

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

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.
Angehängte Dateien
Dateityp: zip approxstrutils_demo_160.zip (6,1 KB, 65x aufgerufen)
Dateityp: pas approxstrutils_118.pas (15,2 KB, 70x aufgerufen)
The angels have the phone box.
 
Benutzerbild von FAlter
FAlter

 
Delphi 10.2 Tokyo Starter
 
#2
  Alt 16. Mai 2008, 18:26
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
Felix Alter
  Mit Zitat antworten Zitat
Dezipaitor

 
Delphi 7 Professional
 
#3
  Alt 16. Mai 2008, 19:16
Was ist mit Unicode?
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

 
Delphi 11 Alexandria
 
#4
  Alt 16. Mai 2008, 19:36
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#5
  Alt 17. Mai 2008, 19:21
Also mit unicode würde es mir auch besser gefallen,

aber sonst sind es schon hübsche Funktionen



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


'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.
Angehängte Dateien
Dateityp: zip approxstrutils_demo_730.zip (5,9 KB, 33x aufgerufen)
  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 06:14 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