Uguaglianza di stringa, ignora il caso?


8

D: come si verifica l'uguaglianza delle stringhe ma si ignora il caso?

Ho una situazione in cui mi piacerebbe confrontare le stringhe ma ignorare il caso. Il caso è significativo string-equale apparentemente insensibile a case-fold-search:

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

Potrei sempre preelaborare le stringhe (diciamo, con downcase) prima di confrontarle:

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

Ma sembra eccessivo fare due chiamate di funzione extra ogni volta. Ho trascurato da qualche parte la relativa funzione predicata?


Ho usato stringhe di confronto e ho riscontrato il seguente problema. (setq str "title") (cond (compare-string str "authortitle") fa qualcosa.) (compare-string str "title") fa qualcos'altro.) La prima stringa di confronto restituisce un valore positivo che implica vero che non è quello che voglio. Pertanto ho usato il suggerimento downcase.

Risposte:


7

Puoi usare compare-strings:

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

Usa nils per inizio e fine per usare l'intera stringa.


Grazie; L'avevo visto ma non mi ero reso conto che si potevano usare nils come hai detto. Lascerò la domanda un po 'più a lungo nel caso in cui ci sia un'altra opzione che non richiede 4 nilsecondi in più in una chiamata di funzione.
Dan

5

Utilizzare string-suffix-p:

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

Molto più semplice e non richiede 4 nilsecondi. Non verifica se le stringhe sono uguali di per sé ( (string-suffix-p "word" "buzzword" t) ⇒ t). Tuttavia, in alcuni casi questo dovrebbe essere sufficiente (se si dispone di un dizionario limitato da controllare).


2
(string-suffix-p "strinG" "this string" t)ritorna anche t. Questo non è ciò che l'OP vuole. Ti suggerisco di modificare o eliminare questa risposta.
Tobias,

Risposta aggiornata Lo lascerò perché string-{prefix,suffix}-ppuò essere utile in molti modi: prova se viene data la parola al punto tastiera (ad esempio in SQL dove è possibile mescolare il caso) ecc.
rgtk

3

Un'altra breve alternativa:

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

equalpè l'abbreviazione di cl-equalp; da (documentation 'equalp):

come 'uguale', tranne per il fatto che accetta numeri numericamente uguali di tipi diversi (float vs. intero) e confronta anche le stringhe senza distinzione tra maiuscole e minuscole .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.