Igualdade de cadeias, ignorar maiúsculas e minúsculas?

8

P: como um teste de igualdade de cadeia de caracteres mas ignora maiúsculas e minúsculas?

Eu tenho uma situação em que eu gostaria de comparar strings, mas ignorar maiúsculas e minúsculas. O caso é significativo string-equale, aparentemente, é insensível a case-fold-search:

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

Eu sempre podia pré-processar as strings (digamos, com downcase) antes de compará-las:

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

Mas isso parece um exagero ao fazer duas chamadas de função extras todas as vezes. Eu negligenciei a função de predicado relevante em algum lugar?

Dan
fonte
Usei compare-strings e encontrei o seguinte problema. (setq str "title") (cond (compare-strings str "authortitle") faz alguma coisa.) (compare-strings str "title") faz outra coisa.) As primeiras comparações retornam um valor positivo implicando verdadeiro, o que não é o que eu quero. Portanto, usei a sugestão minúscula.

Respostas:

7

Você pode usar compare-strings:

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

Use nils para começar e terminar para usar as strings inteiras.

choroba
fonte
Obrigado; Eu já tinha visto esse, mas não percebi que alguém poderia usar nils como você mencionou. Deixarei a questão em aberto um pouco mais, caso haja outra opção que não exija 4 nils extras em uma chamada de função.
Dan
5

Use string-suffix-p:

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

Muito mais simples e não requer 4 nils. Ele não testa se as strings são iguais per se ( (string-suffix-p "word" "buzzword" t) ⇒ t). Embora, em alguns casos, isso seja suficiente (se você tiver um dicionário limitado para verificar).

rgtk
fonte
2
(string-suffix-p "strinG" "this string" t)também retorna t. Não é isso que o OP quer. Sugiro que você modifique ou exclua esta resposta.
Tobias
Resposta atualizada. Vou deixá-lo porque string-{prefix,suffix}-ppode ser útil de várias maneiras: teste se a palavra no momento é fornecida com teclado (no SQL, por exemplo, onde o caso pode ser misturado) etc.
rgtk
3

Outra alternativa curta:

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

equalpé a abreviação de cl-equalp; de (documentation 'equalp):

como 'igual', exceto que ele aceita números numericamente iguais de tipos diferentes (float vs. número inteiro) e também compara cadeias sem distinção entre maiúsculas e minúsculas .

dardisco
fonte