2014-10-15 27 views
40

Tôi cần kiểm tra xem chuỗi java có chứa chuỗi con trong các thử nghiệm của tôi hay không.Kiểm tra xem Chuỗi có chứa chuỗi con trong clojure

này không làm việc vì chuỗi java không sưu tập:

(deftest test_8 
    (testing "get page from sputnik" 
     (let [ 
      band "Isis" 
      page (get-sputnikpage-for-artist band) 
      ] 
      (is (contains? band "Isis")))));does NOT work 

Có cách nào để chuyển đổi chuỗi java vào bộ sưu tập? Hoặc tôi có thể kiểm tra sự xuất hiện chuỗi con theo những cách khác không?

+4

Lưu ý rằng có chứa? KHÔNG kiểm tra sự tồn tại của các giá trị, nhưng sự tồn tại của các khóa (bản đồ) hoặc các chỉ số (các vectơ và các chuỗi). Một trong những cạm bẫy phổ biến nhất trong việc đặt tên hàm Clojure. Cả hai (chứa? [1 2] 2) và (chứa? "12" 2) => sai vì không có chỉ mục 2 (chỉ 0 & 1) – NielsK

Trả lời

65

Cách đơn giản nhất là sử dụng phương pháp contains từ java.lang.String:

(.contains "The Band Named Isis" "Isis")

=> true

Bạn cũng có thể làm điều đó với biểu thức thông thường, ví dụ

(re-find #"Isis" "The Band Named Isis") 

=> "Isis"

(re-find #"Osiris" "The Band Named Isis") 

=> nil

Nếu bạn cần kết quả của bạn là đúng hay sai, bạn có thể bọc nó trong boolean:

(boolean (re-find #"Osiris" "The Band Named Isis"))

=> false

5

Strings là seqable:

(seq "Hello") ;;=> (\H \e \l \l \o) 

... vì vậy bạn có thể sử dụng thư viện chuỗi để tìm một trận đấu:

(defn subsumes [main sub] 
    (some 
    (partial = (seq sub)) 
    (partition (count sub) 1 main))) 

(subsumes "Hello" "ll") ;;=>> true 

... nhưng nó đơn giản hơn và nhanh hơn nhiều việc phải làm as Diego Basch suggested .

+0

@Rovanion Bạn đã đọc sai câu trả lời. Chúng ta đồng ý. – Thumbnail

+0

Ồ, bạn đúng, dĩ nhiên! Xin lỗi vì đã làm phiền bạn. – Rovanion

35

Clojure 1.8 đã giới thiệu chức năng includes?.

(use '[clojure.string :as s]) 
(s/includes? "abc" "ab") ; true 
(s/includes? "abc" "cd") ; false 
Các vấn đề liên quan