N° | Fonction | Catégorie | Version |
---|---|---|---|
BIS 03 | BiS_TestStrNo | 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_TestStrNo 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 ne fait pas la différence entre majuscules et minuscules. (Dans le cas contraire, voir la routine BiS_TestStr) 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_TestStrNo "azerty" "er") retourne 3 BiS_TestStrNo "azerty" "ER") retourne 3 Ne fait pas la différence entre majuscules et minuscules. (BiS_TestStrNo "azerty" "f") retourne nil "f" n'existe pas dans la chaîne. (BiS_TestStrNo 12345 "12") retourne nil Le 1er argument doit être une chaîne. (BiS_TestStrNo "21345" "13") retourne 2 (BiS_TestStrNo "Azertyazerty" "AZ") retourne 7 La chaîne "az" figure 2 fois. La dernière occurrence est retournée. (BiS_TestStrNo "AZERTY" "rty") retourne 4 |
1- (defun BiS_TestStrNo (*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 (= (strcase *Text2) (strcase (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 transformé en majuscules est égal à la portion de *Text1, transformée en majuscules, 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.