web-dev-qa-db-fra.com

Vérifiez si la chaîne contient une sous-chaîne dans clojure

Je dois vérifier si une chaîne Java contient une sous-chaîne dans mes tests.

Cela ne fonctionne pas car Java ne sont pas des collections:

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

Existe-t-il un moyen de convertir des chaînes Java en collections? Ou puis-je vérifier les occurrences de sous-chaîne par d'autres moyens?

41
Luke

Le moyen le plus simple consiste à utiliser la méthode contains à partir de Java.lang.String:

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

=> vrai

Vous pouvez également le faire avec des expressions régulières, par exemple.

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

=> "Isis"

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

=> néant

Si vous avez besoin que votre résultat soit vrai ou faux, vous pouvez l'encapsuler dans boolean:

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

=> faux

72
Diego Basch

Clojure 1.8 a introduit la fonction inclut? .

(use '[clojure.string :as s])
(s/includes? "abc" "ab") ; true
(s/includes? "abc" "cd") ; false
45
Sanghyun Lee

Les chaînes sont séparables:

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

... afin que vous puissiez utiliser la bibliothèque de séquences pour trouver une correspondance:

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

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

... mais c'est plus simple et beaucoup plus rapide à faire comme l'a suggéré Diego Basch .

5
Thumbnail