【问题标题】:Check if String contains substring in clojure检查字符串是否包含clojure中的子字符串
【发布时间】:2014-12-10 18:41:54
【问题描述】:

我需要检查 java 字符串是否在我的测试中包含子字符串。

这不起作用,因为 java 字符串不是集合:

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

有没有办法将java字符串转换成集合?或者我可以通过其他方式检查子字符串的出现吗?

【问题讨论】:

  • 知道包含吗?不检查值的存在,但检查键(映射)或索引(向量和字符串)的存在。 Clojure 函数命名中最常见的缺陷之一。 (contains? [1 2] 2) 和 (contains? "12" 2) => false 因为两者都没有索引 2(只有 0 和 1)

标签: string clojure


【解决方案1】:

最简单的方法是使用java.lang.String中的contains方法:

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

=> 是的

你也可以用正则表达式来做,例如

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

=> “伊希斯”

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

=> 无

如果你需要你的结果是真或假,你可以把它包裹在boolean

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

=> 错误

【讨论】:

    【解决方案2】:

    Clojure 1.8 引入了includes? 功能。

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

    【讨论】:

      【解决方案3】:

      字符串是可排序的:

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

      ...所以您可以使用序列库来查找匹配项:

      (defn subsumes [main sub]
        (some
         (partial = (seq sub))
         (partition (count sub) 1 main)))
      
      (subsumes "Hello" "ll") ;;=>> true
      

      ...但是as Diego Basch suggested 更简单、更快捷。

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 2013-05-18
        • 2021-12-20
        • 1970-01-01
        • 2014-11-22
        • 2013-02-05
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        相关资源
        最近更新 更多