Kesetaraan string, abaikan case?

8

T: bagaimana cara seseorang menguji kesetaraan string tetapi mengabaikan case?

Saya punya situasi di mana saya ingin membandingkan string tetapi abaikan case. Kasus penting untuk string-equal, dan tampaknya tidak peka terhadap case-fold-search:

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

Saya selalu bisa memproses terlebih dahulu string (katakanlah, dengan downcase) sebelum membandingkannya:

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

Tapi itu sepertinya terlalu banyak melakukan dua panggilan fungsi ekstra setiap waktu. Sudahkah saya mengabaikan fungsi predikat yang relevan di suatu tempat?

Dan
sumber
Saya menggunakan string pembanding dan menemukan masalah berikut. (setq str "title") (cond (bandingkan-string str "authortitle") melakukan sesuatu.) (bandingkan-str str str "judul") melakukan sesuatu yang lain.) Perbandingan-string pertama mengembalikan nilai positif yang menyiratkan true yang tidak apa yang saya inginkan. Karena itu saya menggunakan saran downcase.

Jawaban:

7

Anda bisa menggunakan compare-strings:

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

Gunakan nils untuk memulai dan mengakhiri untuk menggunakan seluruh string.

choroba
sumber
Terima kasih; Saya pernah melihat itu tetapi tidak menyadari bahwa seseorang dapat menggunakan nils seperti yang Anda sebutkan. Saya akan membiarkan pertanyaan terbuka sedikit lebih lama jika ada opsi lain yang tidak memerlukan 4 ekstra nildalam panggilan fungsi.
Dan
5

Gunakan string-suffix-p:

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

Jauh lebih sederhana dan tidak membutuhkan 4 nildetik. Itu tidak menguji apakah string sama per se ( (string-suffix-p "word" "buzzword" t) ⇒ t). Meskipun, dalam beberapa kasus ini harus memadai (jika Anda memiliki kamus terbatas untuk memeriksa).

rgtk
sumber
2
(string-suffix-p "strinG" "this string" t)juga kembali t. Ini bukan yang diinginkan OP. Saya sarankan Anda memodifikasi atau menghapus jawaban ini.
Tobias
Jawaban diperbarui. Saya akan meninggalkannya karena string-{prefix,suffix}-pdapat berguna dalam banyak hal: menguji apakah kata pada titik diberikan keyboard (dalam SQL misalnya di mana case dapat dicampur) dll.
rgtk
3

Alternatif pendek lainnya:

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

equalpkependekan dari cl-equalp; dari (documentation 'equalp):

seperti 'sama', kecuali bahwa ia menerima jumlah yang sama secara numerik dari berbagai jenis (float vs integer), dan juga membandingkan string case-insensitive .

dardisco
sumber