So, hab ein bißchen gesucht und bin fündig geworden. Der Code ist allerdings nicht von mir, den hab ich mir selber vor ner halben Ewigkeit mal irgendwo abgeholt. Der war Teil einer Funktion, um in einer TStrings-Liste das Element zu finden, das einem vorgegebenen String am ähnlichsten war. Daher hoffe ich mal, daß die Funktion so für sich alleine auch funtkioniert. Falls nich, meld dich einfach nochmal.
So, wie funktioniert das ganze? Du übergibst der Funktion deine 2 Strings und bekommst dann einen Integer zurück, der - wie der Name der Funktion schon sagt - die Distanz der beiden Strings ausdrückt. Bei 0 stimmen sie überein, ansonsten sind sie halt dementsprechend verschieden. Kannst ja ein bißchen rumexperimentieren, welche Werte für kleinere Tippfehler rauskommen und was gerade noch akzeptabel ist.
Delphi-Quellcode:
function LevenshteinDistance(
const sString,sPattern:
String): Integer;
const
MAX_SIZE = 50;
var
aiDistance:
array [0..MAX_SIZE,0..MAX_SIZE]
of Integer;
i,j,
iP,iQ,iR,iPP,
iStringLength,
iPatternLength,
iMaxI,iMaxJ : Integer;
chChar : Char;
function Min(X,Y,Z: Integer): Integer;
begin
if (X<Y)
then
Result:=X
else
Result:=Y;
if (Result>Z)
then
Result:=Z;
end;
{ Min }
begin
iStringLength:=length(sString);
if (iStringLength>MAX_SIZE)
then
iMaxI:=MAX_SIZE
else
iMaxI:=iStringLength;
iPatternLength:=length(sPattern);
if (iPatternLength>MAX_SIZE)
then
iMaxJ:=MAX_SIZE
else
iMaxJ:=iPatternLength;
aiDistance[0, 0]:=0;
for i:=1
to iMaxI
do
aiDistance[i, 0]:=aiDistance[i-1, 0]+FiR0;
for j:=1
to iMaxJ
do begin
chChar:=sPattern[j];
if ((chChar='
*')
or (chChar='
?'))
then
iP:=0
else
iP:=FiP0;
if (chChar='
*')
then
iQ:=0
else
iQ:=FiQ0;
if (chChar='
*')
then
iR:=0
else
iR:=FiR0;
aiDistance[0, j]:=aiDistance[0, j-1]+iQ;
for i:=1
to iMaxI
do begin
if (sString[i]=sPattern[j])
then
iPP:=0
else
iPP:=
iP;
{*** aiDistance[i,j] := Minimum of 3 values ***}
aiDistance[i,j]:=Min(aiDistance[i-1, j-1]+iPP,
aiDistance[i, j-1] +iQ,
aiDistance[i-1, j] +iR);
end;
end;
Result:=aiDistance[iMaxI, iMaxJ];
end;
Und
hier haste den SoundEx mal in VB. Vielleicht wird daran die Funktionsweise klar.
Hab jetzt leider auf die schnelle bei Google nix in Delphi Language gefunden (Aber ich muß gestehen, ich hab auch grad keine große Lust gehabt und deswegen nich besonders intensiv gesucht

).