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?
Réponses:
Vous pouvez utiliser
compare-strings
:Utilisez
nil
s pour les débuts et les fins pour utiliser les chaînes entières.la source
nil
s 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 4nil
s supplémentaires dans un appel de fonction.Utilisation
string-suffix-p
:Beaucoup plus simple et ne nécessite pas 4
nil
s. 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).la source
(string-suffix-p "strinG" "this string" t)
revient égalementt
. Ce n'est pas ce que souhaite le PO. Je vous suggère de modifier ou de supprimer cette réponse.string-{prefix,suffix}-p
peut ê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.Une autre courte alternative:
equalp
est l'abréviation decl-equalp
; de(documentation 'equalp)
:la source