Hi!
Hatte ein wenig daran rumgespielt, aber so einfach ist es dann doch wieder nicht, weil ich einen definierten Anfang brauche für die Suche. Da scheint mir ein Regulärer Ausdruck evtl. doch besser, weil man den greedy oder non-greedy machen könnte.
Hast du mal nach solche Algorithmen gesucht, das ist ja ein klassisches Problem, solche Tippfehler oder ausgelassene Buchstaben zu finden (Google)?
Mein letzter Stand (funktioniert nicht, aber vielleicht die Idee interessant):
[autoit]Func _findMisspelledWord($_longWord, $_searchWord, $_length_factor, $_similarity_factor, $_caseSens = 1)
; by peethebee (dont remove this!)
Local $_good = 0
Local $_bad = 0
Local $_firstPos = -1
Local $_lastPos = -1
; Wort1 durchlaufen
For $_i = 1 To StringLen($_searchWord)
;~ ConsoleWrite(StringFormat("Testing letter %s", StringMid($_word1, $_i, 1)) & @CRLF)
$_pos = StringInStr($_longWord, StringMid($_searchWord, $_i, 1), $_caseSens)
If ($_pos = 0) Then
; nicht in Wort2
;~ ConsoleWrite(StringFormat("Not in Word2, like %i more so far.", $_bad) & @CRLF)
$_bad = $_bad + 1
Else
; schon in Wort2 -> Entfernen, damit Buchstabenanzahl korrekt beachtet wird
;~ ConsoleWrite(StringFormat("In Word2, like %i more so far.", $_good) & @CRLF)
If ($_good = 0) Then
$_firstPos = $_pos
EndIf
$_lastPos = $_pos
$_good = $_good + 1
$_longWord = StringTrimLeft($_longWord, $_pos)
EndIf
Next
; Tests
If ($_good / ($_good + $_bad) < $_similarity_factor) Then Return $_searchWord
Local $_length_factor_found
Local $_foundLength = $_lastPos - $_firstPos
If ($_foundLength < StringLen($_searchWord)) Then
$_length_factor_found = $_foundLength / StringLen($_searchWord)
Else
$_length_factor_found = StringLen($_searchWord) / $_foundLength
EndIf
If $_length_factor_found < $_length_factor Then Return $_searchWord
Return StringMid($_longWord, $_firstPos, $_lastPos - $_firstPos)
EndFunc ;==>_findMisspelledWord
$ret = _findMisspelledWord("BtrekAutoitzppoitro", "Auttoi", 0.4, 0.8, True)
ConsoleWrite(StringFormat("Meinten Sie vielleicht %s?", $ret) & @CRLF)
peethebee