我有一个字符串列表 fx '("abc" "def" "gih") 并且我希望能够在列表中搜索包含 fx "ef" 的任何项目并获得返回的项目或索引。
这是怎么做到的?
结合起来filter
可以re-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")
如果要检索匹配位置的所有索引以及元素,可以尝试以下操作:
(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 %))
只是指数:
懒洋洋:
(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 的回答。
这是一个返回索引的传统递归定义。也很容易修改以返回相应的字符串。
(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
' 结果计数为 true 的事实,除非它失败,在这种情况下它返回nil
。如果前面的步骤不成功,则函数从序列的其余部分和递增的索引. 如果到达序列的末尾,则返回 nil。)