N° | Fonction | Catégorie | Version |
---|---|---|---|
BIS 02 | BiS_TestStr | Gestion de Chaînes | 1.0 - Janvier 2007 |
But | Teste si une chaîne est contenu dans une autre chaîne, et si oui, retourne sa position. |
Prototype | (BiS_TestStr Texte_Cible Texte_recherché) |
Arguments | Texte_Cible - Le texte cible à analyser - chaîne - Texte_recherché - Le texte recherché - chaîne - |
Retours | Nil ou la position du premier caractère de la chaîne - Entier - |
Var. globales | Néant |
Description | Retourne la position du premier caractère de la dernière occurrence d'un texte contenu dans une chaîne, ou nil si ce texte n'existe pas. |
Notes | La fonction tient compte des majuscules ou des minuscules. (Dans le cas contraire, voir la routine BiS_TestStrNo) S'il y a plusieurs occurrences du texte recherché dans la chaîne, c'est la position de la dernière qui est retournée. La fonction wcmatch peut remplacer cette routine si on ne tient pas compte de la position du caractère. |
Exemples | (BiS_TestStr "azerty" "er") retourne 3 (BiS_TestStr "azerty" "ER") retourne nil Fait la différence entre majuscules et minuscules. (BiS_TestStr "azerty" "f") retourne nil "f" n'existe pas dans la chaîne. (BiS_TestStr 12345 "12") retourne nil Le 1er argument doit être une chaîne. (BiS_TestStr "21345" "13") retourne 2 (BiS_TestStr "azertyazerty" "az") retourne 7 La chaîne "az" figure 2 fois. La dernière occurrence est retournée. (BiS_TestStr "AZERTY" "RTY") retourne 4 |
1- (defun BiS_TestStr (*Text1 *Text2 / Cpt1 Flag Lg2) 2- (if (and 3- (= (type *Text1) 'STR) 4- (= (type *Text2) 'STR) 5- ) 6- (progn 7- (setq Lg2 (strlen *Text2) 8- Cpt1 (1+ (- (strlen *Text1) Lg2)) 9- ) 10- (while (> Cpt1 0) 11- (if (= *Text2 (substr *Text1 Cpt1 Lg2)) 12- (setq Flag Cpt1 13- Cpt1 0) 14- (setq Cpt1 (1- Cpt1)) 15- ) 16- ) 17- (eval Flag) 18- ) 19- ) 20- )
Lignes 2-5 : Si les arguments *Text1 et *Text2 sont des chaînes, Ligne 7 : Stocke dans la variable Lg2 la longueur de la chaîne *Text2.. Ligne 8 : et dans la variable Cpt1 la longueur de la chaîne *Text1 après avoir retiré la longueur de *Text2 -1. (Il est inutile de tester toute la longueur -- gain de temps.) Ligne 10 : Boucle tant que Cpt1 est supérieur à zéro Ligne 11 : Si *Text2 est identique à la portion de *Text1 commençant au caractère n° Cpt1 et de longueur égale a *Text2 Ligne 12 : Stocke la valeur de Cpt1 dans Flag Ligne 13 : et met le compteur Cpt1 à zéro pour arrêter la boucle. Ligne 14 : Sinon décrémente le compteur de caractères de 1 Ligne 16 : Fin de la boucle while Ligne 17 : Retourne la valeur de Flag qui sera nil, si la chaîne n'a pas été trouvée.