我有一个字符串列表,fx'(“abc”“def”“gih”),我希望能够在列表中搜索包含fx“ef”的任何项目并获取返回的项目或索引。
这是怎么做到的?
答案 0 :(得分:2)
合并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")
答案 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。)