【问题标题】:How do I write a Clojure macro to create a regular expression from a String?如何编写 Clojure 宏以从字符串创建正则表达式?
【发布时间】:2011-03-26 03:55:32
【问题描述】:

我正在创建一个便利宏。部分方便之处在于,可以仅使用字符串而不是 #"re" 表示法来指定正则表达式。

我想不通的部分是如何让宏获取字符串并将其重写为 Clojure 正则表达式(例如,生成 #"re" 符号)。我认为这是一个语法/转义问题。

我的第一次天真的尝试(假装我只想要 String-to-regex 部分):

(defmacro mymac [mystr] `#~mystr)

甚至可以做我想做的事吗?或者,是否有一个实际的函数来获取一个字符串并生成一个正则表达式,而不是使用 # reader 宏?

或者我应该直接进入 Java 并使用 java.util.regex.Pattern?

【问题讨论】:

    标签: regex macros clojure


    【解决方案1】:

    它有一个函数:re-pattern

    user=> (re-pattern "\\d+")
    #"\d+"
    

    【讨论】:

      【解决方案2】:

      再解释一下:

      #"" 是一个阅读器宏。它由读者在阅读时解决。因此无法创建扩展为读取器宏的宏,因为读取阶段早已过去。宏返回表示扩展代码的实际数据结构,而不是像例如再次解析的字符串。 #define 在 C 中工作。

      j-g-faustus 的答案是正确的方法(tm)。

      【讨论】:

      • 谢谢 kotarak。我应该意识到为什么阅读器生命周期会阻止我做我想做的事情。谢谢!
      【解决方案3】:

      我可能误解了这个问题,但这不是你想要的吗?

      user=> (. java.util.regex.Pattern compile "mystr")
      #"mystr"
      

      【讨论】:

      • 是的,它完全符合我的要求。但你不得不承认,不如 j-g-faustus 的漂亮 (re-pattern "mystr")
      【解决方案4】:

      逐字匹配字符串,忽略特殊字符:

      (defn to-regex [some-string]
        (re-pattern (java.util.regex.Pattern/quote some-string)))
      

      那么... 将只匹配...,而不是aaa 或任何其他三个字母组合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 2016-01-13
        • 2014-09-15
        • 1970-01-01
        • 1970-01-01
        • 2018-07-15
        相关资源
        最近更新 更多