Chuỗi bình đẳng, bỏ qua trường hợp?


8

Q: làm thế nào để kiểm tra một chuỗi bằng nhưng bỏ qua trường hợp?

Tôi đã có một tình huống trong đó tôi muốn so sánh các chuỗi nhưng bỏ qua trường hợp. Trường hợp có ý nghĩa đối với string-equalvà dường như không nhạy cảm với case-fold-search:

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

Tôi luôn có thể tiền xử lý các chuỗi (nói, với downcase) trước khi so sánh chúng:

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

Nhưng điều đó có vẻ như quá mức cần thiết để thực hiện hai cuộc gọi chức năng bổ sung mỗi lần. Tôi đã bỏ qua chức năng vị ngữ có liên quan ở đâu đó?


Tôi đã sử dụng chuỗi so sánh và tìm thấy vấn đề sau đây. (setq str "title") (cond (so sánh chuỗi str "authortitle") làm một cái gì đó.) (so sánh chuỗi str "title") làm một cái gì đó khác. những gì tôi muốn. Vì vậy, tôi đã sử dụng gợi ý chữ hoa.

Câu trả lời:


7

Bạn có thể sử dụng compare-strings:

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

Sử dụng nils để bắt đầu và kết thúc để sử dụng toàn bộ chuỗi.


Cảm ơn; Tôi đã thấy cái đó nhưng không nhận ra rằng người ta có thể sử dụng nils như bạn đã đề cập. Tôi sẽ để câu hỏi mở lâu hơn một chút trong trường hợp có một tùy chọn khác không yêu cầu thêm 4 nilgiây trong một cuộc gọi chức năng.
Dân

5

Sử dụng string-suffix-p:

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

Đơn giản hơn nhiều và không cần 4 nils. Nó không kiểm tra nếu các chuỗi bằng nhau trên mỗi se ( (string-suffix-p "word" "buzzword" t) ⇒ t). Mặc dù, trong một số trường hợp, điều này là đủ (nếu bạn có từ điển hạn chế để kiểm tra).


2
(string-suffix-p "strinG" "this string" t)cũng trở về t. Đây không phải là những gì OP muốn. Tôi đề nghị bạn sửa đổi hoặc xóa câu trả lời này.
Tobias

Trả lời cập nhật. Tôi sẽ bỏ nó vì string-{prefix,suffix}-pcó thể hữu ích theo nhiều cách: kiểm tra xem từ tại điểm có được đưa ra bàn phím không (ví dụ như SQL có thể trộn lẫn trường hợp), v.v.
rgtk

3

Một cách khác ngắn:

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

equalplà viết tắt của cl-equalp; từ (documentation 'equalp):

như 'bằng', ngoại trừ việc nó chấp nhận số lượng bằng nhau của các loại khác nhau (float so với số nguyên) và cũng so sánh các chuỗi không phân biệt chữ hoa chữ thường .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.