Égalité des chaînes, ignorer la casse?

8

Q: comment tester l'égalité des chaînes mais ignorer la casse?

J'ai une situation dans laquelle j'aimerais comparer des chaînes mais ignorer la casse. Le cas est significatif pour string-equal, et est apparemment insensible à case-fold-search:

(string-equal "string" "StrinG")        ; => nil
(let ((case-fold-search t))
  (string-equal "string" "StrinG"))     ; => nil

Je pouvais toujours prétraiter les chaînes (disons avec downcase) avant de les comparer:

(string-equal (downcase "string")
              (downcase "StrinG"))      ; => t

Mais cela semble exagéré de faire deux appels de fonction supplémentaires à chaque fois. Ai-je oublié quelque part la fonction de prédicat pertinente?

Dan
la source
J'ai utilisé des chaînes de comparaison et trouvé le problème suivant. (setq str "title") (cond (compare-strings str "authortitle") fait quelque chose.) (compare-strings str "title") fait autre chose.) La première compare-strings renvoie une valeur positive impliquant vrai qui n'est pas ce que je veux. J'ai donc utilisé la suggestion de downcase.

Réponses:

7

Vous pouvez utiliser compare-strings:

(compare-strings STR1 START1 END1 STR2 START2 END2 &optional IGNORE-CASE)

Utilisez nils pour les débuts et les fins pour utiliser les chaînes entières.

choroba
la source
Merci; J'avais vu celui-là mais je ne savais pas que l'on pouvait utiliser nils comme vous l'avez mentionné. Je laisse la question ouverte un peu plus longtemps s'il y a une autre option qui ne nécessite pas 4 nils supplémentaires dans un appel de fonction.
Dan
5

Utilisation string-suffix-p:

(string-suffix-p "string" "strinG" t)

Beaucoup plus simple et ne nécessite pas 4 nils. Il ne teste pas si les chaînes sont égales en soi ( (string-suffix-p "word" "buzzword" t) ⇒ t). Bien que, dans certains cas, cela devrait être suffisant (si vous avez un dictionnaire limité à vérifier).

rgtk
la source
2
(string-suffix-p "strinG" "this string" t)revient également t. Ce n'est pas ce que souhaite le PO. Je vous suggère de modifier ou de supprimer cette réponse.
Tobias
Réponse mise à jour. Je vais le laisser car string-{prefix,suffix}-ppeut être utile à bien des égards: tester si le mot au point est donné au clavier (en SQL par exemple où la casse peut être mélangée) etc.
rgtk
3

Une autre courte alternative:

(equalp "string" "strinG")      ; => t
(equalp "strinG" "this string") ; => nil 
(equalp "word" "buzzword")      ; => nil

equalpest l'abréviation de cl-equalp; de (documentation 'equalp):

comme 'égal', sauf qu'il accepte des nombres numériquement égaux de différents types (flottant ou entier), et compare également les chaînes sans tenir compte de la casse .

dardisco
la source