Clojure/ClojureScript中的一个不区分大小写的过滤器
我有这个功能:Clojure/ClojureScript中的一个不区分大小写的过滤器,clojure,clojurescript,Clojure,Clojurescript,我有这个功能: (defn list-data [alist filter-text] (filter (fn [x] (if (nil? filter-text) true (> (.indexOf x filter-text) -1))) alist)) (list-data ["Lion" "Zebra" "Buffalo" "Antelope"] "a") ;=> ("Zebra" "Buffalo") 是否有更惯用的方法编写此
(defn list-data [alist filter-text]
(filter (fn [x] (if (nil? filter-text) true
(> (.indexOf x filter-text) -1))) alist))
(list-data ["Lion" "Zebra" "Buffalo" "Antelope"] "a")
;=> ("Zebra" "Buffalo")
是否有更惯用的方法编写此函数并尊重我不需要区分大小写的过滤器这一事实,这意味着我希望(列表数据[“狮子”、“斑马”、“水牛”、“羚羊”]“a”)
返回以下内容:
;=> ("Zebra" "Buffalo" "Antelope")
谢谢
(这需要在
.cljs
文件中工作)在Clojure本身中,通常使用正则表达式来完成。在Java正则表达式中,您可以通过为要进行的匹配提供大小写不敏感的标志,或者在regex的开头提供全局大小写不敏感的标志:
(filter #(re-find #"(?i)a" %)
["Lion" "Zebra" "Buffalo" "Antelope"])
纯Javascript正则表达式仅支持全局标志。它们以字符串形式给出,作为正则表达式构造函数的第二个参数:
(filter #(re-find (js/RegExp. "a" "i") %)
["Lion" "Zebra" "Buffalo" "Antelope"])
然而,为了方便起见并保持Java和Javascript之间的正则表达式相似,Clojurescript阅读器将全局Java样式标志(位于正则表达式开头的标志)转换为它们的Javascript全局等价物
因此,第一个示例在Clojurescript中也适用。请注意,非全局标志在Clojurescript中不适用于Clojure。Javascript正则表达式不支持内联修饰符标志(即,
(?i)
)。据我所知,Clojurescript阅读器支持Java类型的内联标志。获取在正则表达式开头找到的任何内联标志,并使用全局标志代替它们。因此,实际上您不能内联更改内容(因为javascript不支持它),但如果您需要全局标志,可以使用类似clojure的语法。谢谢@现在我有了一个普通的键盘,amalloy对答案作了进一步的解释。@thumboil谢谢!接得好!解决此问题的另一种方法是保留小写值的缓存,然后使用纯clojure.string/以?
开头,这可能会更快,但会占用更多内存。谢谢!这个例子也很好:你的答案比@Nielsk的答案更详细。
(filter #(re-find (js/RegExp. "a" "i") %)
["Lion" "Zebra" "Buffalo" "Antelope"])