如何查找包含特定子字符串的列表项

时间:2013-11-04 22:47:38

标签: clojure

我有一个字符串列表,fx'(“abc”“def”“gih”),我希望能够在列表中搜索包含fx“ef”的任何项目并获取返回的项目或索引。

这是怎么做到的?

4 个答案:

答案 0 :(得分:2)

合并filterre-find可以很好地完成这项工作。

user> (def fx '("abc" "def" "gih")) 
#'user/fx

user> (filter (partial re-find #"ef") fx)
("def")

user> (filter (partial re-find #"a") fx)
("abc")

在这种情况下,我喜欢将它们与partial结合起来,尽管在这种情况下定义匿名函数也可以正常工作。如果您事先不知道搜索字符串,则使用re-pattern也很有用:

user> (filter (partial re-find (re-pattern "a")) fx)
("abc")

答案 1 :(得分:1)

如果要检索匹配位置的所有索引以及元素,可以尝试:

(filter #(re-find #"ef" (second %)) (map-indexed vector '("abc" "def" "gih")))
=>([1 "def"])

map-indexed vector生成索引/值延迟序列

user> (map-indexed vector '("abc" "def" "gih"))
  ([0 "abc"] [1 "def"] [2 "gih"])

然后您可以filter使用正则表达式对每个列表成员的second元素。

 #(re-find #"ef" (second %))

答案 2 :(得分:1)

只是指数:

  • 懒洋洋:

    (keep-indexed #(if (re-find #"ef" %2)
                      %1) '("abc" "def" "gih"))
    => (1)
    
  • 使用循环/重复

    (loop [[str & strs] '("abc" "def" "gih")
           idx 0
           acc []]
      (if str
        (recur strs
               (inc idx)
               (cond-> acc
                 (re-find #"ef" str) (conj idx)))
        acc))
    

    仅针对元素,请参阅Arthur Ulfeldts的回答。

答案 3 :(得分:0)

这是一个返回索引的传统递归定义。修改也很容易返回相应的字符串。

(defn strs-index [re lis] 
  (let [f (fn [ls n] 
             (cond 
               (empty? ls) nil 
               (re-find re (first ls)) n
               :else (recur (rest ls) (inc n))))]
    (f lis 0)))

user=> (strs-index #"de" ["abc" "def" "gih"])
1
user=> (strs-index #"ih" ["abc" "def" "gih"])
2
user=> (strs-index #"xy" ["abc" "def" "gih"])
nil

(解释:帮助函数f被定义为let中的绑定,然后在结束时被调用。如果传递给它的字符串序列不为空,它会搜索序列的第一个元素中的正则表达式,如果找到字符串则返回索引。这使用re-find的结果计为真的事实,除非它失败,在这种情况下它返回nil。如果前面的步骤不成功,则函数将从序列的其余部分和递增的索引开始。如果它到达序列的末尾,则返回nil。)