Clojure/ClojureScript中的不区分大小写的过滤器

leo*_*bot 4 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")
Run Code Online (Sandbox Code Playgroud)

是否有更惯用的方式编写此函数并尊重我不想要区分大小写的过滤器这一事实,这意味着我希望(list-data ["Lion" "Zebra" "Buffalo" "Antelope"] "a")返回以下内容:

;=> ("Zebra" "Buffalo" "Antelope")
Run Code Online (Sandbox Code Playgroud)

谢谢!

(这需要在.cljs文件中工作)

Nie*_*lsK 13

在Clojure本身中,您通常会使用正则表达式执行此操作.在Java正则表达式中,您可以通过为要进行的匹配提供不区分大小写的标志,或者在全局不区分大小写的正则表达式的开头处为此执行此操作:

  (filter #(re-find #"(?i)a" %)
          ["Lion" "Zebra" "Buffalo" "Antelope"])
Run Code Online (Sandbox Code Playgroud)

纯Javascript正则表达式仅支持全局标志.它们以字符串形式作为正则表达式构造函数的第二个参数给出:

  (filter #(re-find (js/RegExp. "a" "i") %)
          ["Lion" "Zebra" "Buffalo" "Antelope"])
Run Code Online (Sandbox Code Playgroud)

但是,为了方便并保持Java和Javascript之间的正则表达式相似,Clojurescript阅读器将全局java样式标志(正则表达式开头的那些)转换为它们的Javascript全局等价物.

所以第一个例子也适用于Clojurescript.请注意,非全局标志在Clojurescript中不起作用,它们可以在Clojure中工作.