在clojure中重新查找函数的动态正则表达式参数

ani*_*roc 5 regex clojure

我正在使用clojure中的重新查找功能,并且具有以下内容:

(defn some-function []
(re-find #"(?i)blah" "some sentence"))
Run Code Online (Sandbox Code Playgroud)

我想要的是让"blah"动态,所以我将var替换为blah,但它不起作用:

(defn some-function2 [some-string]
(re-find #(str "(?i)" some-string) "some sentence"))
Run Code Online (Sandbox Code Playgroud)

我很惊讶这不起作用,因为LISP应该"处理像数据一样的代码".

Dan*_*ero 11

使用功能重新模式.#""只是一个读者宏(又名.用于创建正则表达式的语法糖)

#(str"(?i)"some-string)是读者宏,用于创建匿名函数.

  • 我同意,"重新模式"是最简单的方法.它从字符串构建正则表达式模式.要回答OP的问题,你可以做`(重新找到(重新模式(str"(?i)"some-string))"some sentence")`. (2认同)

joe*_*ohn 5

要在Clojure中从字符串值创建模式,您可以使用重新模式:

(re-pattern (str "(?i)" some-string))
Run Code Online (Sandbox Code Playgroud)

你没有提到的一件事some-string是预期是否包含有效的正则表达式或者它是否是一个任意的字符串值.如果some-string是一个任意的字符串值(你想要完全匹配),你应该在使用它来构建你的正则表达式之前引用它:

(re-pattern (str "(?i)" (java.util.regex.Pattern/quote some-string)))
Run Code Online (Sandbox Code Playgroud)