On peut être amener a effectuer une recherche de chaine sans être sûr de l'orthographe de la chaine recherchée. Cette fonction retourne un pourcentage de ressemblance entre 2 chaines, et ainsi vous pouvez fournir des résultats plus ou moins proche de la chaine recherchée. J'ai utilisé ce code dans un petit utilitaire de recherche de chaines dans des fichiers.
Source / Exemple :
// ----------------------------------------------------------------------------------------
Function ComparerChaines(s1,s2:String):Integer;
{ Fonction comparaison chaînes de texte:
Entrée:
S1 = première chaîne a comparer, taille limitée a 2048 caractères
S2 = deuxième chaîne a comparer, taille limitée a 2048 caractères
Sortie:
INTEGER, de 0 a 100, % de ressemblance entre les 2 chaînes }
Var identiques, // Nombre de caractères identiques
p1,p2, // Indicateurs de position
l1,l2, // Longueurs des chaînes
pt, // Compteur de boucle
diff : Integer; // Facteur d égalisation
hstr : String; // Variable temporaire d échange des chaînes
test : Array [1..2048] Of Boolean; // Tableau d indicateur pour suivre les positions déjà testées
Begin
// Tester les longueurs et échanger si S1 est plus courte, on teste toujours par rapport a la chaîne la plus longue
If Length(s1)<Length(s2) Then Begin
hstr := s2;
s2 := s1;
s1 := hstr;
End;
// Stocker les longueurs des chaînes
l1 := Length(s1);
l2 := Length(s2);
// Une chaîne a vide ? alors la comparaison est de 0%
If (l1=0) Or (l2=0) Then
Result := 0
Else Begin
p1 := 1;
p2 := 1;
identiques := 0;
// Calculer le facteur d égalisation dépendant de la longueur de la chaîne, en général c est 1/3 de la longueur maximale
diff := Max(l1,l2) Div 3 + Abs(l1-l2);
// Initialiser le tableau de suivi
For pt := 1 To l1 Do
test[pt] := False;
// Parcours de la chaîne
Repeat
// Position testée ?
If Not test[p1] Then Begin
// Caractère identique ?
If (s1[p1]=s2[p2]) And (Abs(p1-p2)<=diff) Then Begin
test[p1] := True;
// Augmenter le compteur de caractères identiques
Inc(identiques);
// Positions suivantes
Inc(p1);
Inc(p2);
// Boucler
If p1>l1 Then p1:=1;
End Else Begin
Test[p1] := False;
Inc(p1);
// Boucler a la prochaine position de test si on arrive a la fin de la chaîne
If p1>l1 Then Begin
While (p1>1) And Not (test[p1]) Do
Dec(p1);
Inc(p2)
End;
End;
End Else Begin
Inc(p1);
// Boucler a la prochaine position de test si on arrive a la fin de la chaîne
If p1>l1 Then Begin
Repeat
Dec(p1);
Until (p1=1) Or test[p1];
Inc(p2);
End;
End;
Until p2>Length(s2);
// Calculer la valeur en pourcentage
Result := 100 * identiques Div l1;
End;
End;
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.