将多个功能组合到一个功能中

时间:2014-02-03 18:58:55

标签: regex clojure

我编写了几个输入字符串的函数,并使用不同的正则表达式来搜索字符串中的模式。所有函数都在同一输入[string]上工作。将所有这些功能组合成单个功能的最佳方法是什么?

我曾尝试将所有正则表达式组合成一个正则表达式,但遇到了退化问题。因此,模式适合多个正则表达式并输出不正确的结果。接下来,我尝试使用线程箭头 - >和 - >>但无法让那些人上班。我相信这可能是正确的选择,但无法使功能正常运行。所以我无法检验我的假设。

作为要结合的两个函数的示例,请考虑以下内容:

 (defn fooip [string]   
 (re-seq #"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" string))

(defn foophone [string]
(re-seq #"[0-9]{3}-?[0-9]{3}-?[0-9]{4}" s))

3 个答案:

答案 0 :(得分:7)

如果您要将多个函数组合成一个函数,该函数将返回将每个函数应用于同一输入的结果,那正是juxt的目的。

(def foo (juxt foophone fooip))

(foo "555-555-5555 222.222.222.222 888-888-8888")
;=> [("555-555-5555" "888-888-8888") ("222.222.222.222")]

答案 1 :(得分:2)

你的问题有点模糊,但是线程箭头的目的是将顺序多个函数应用于彼此的输出:(-> 1 inc inc inc),例如,等同于{{ 1}}。

从您的代码示例中,您可能希望与单个输入字符串匹配多个正则表达式。这样做的简单方法是使用(inc (inc (inc 1)))

for

答案 2 :(得分:1)

要检查这两种模式,您可以使用or

(defn phone-or-ip [s]
  (or (matchphone s) (matchip s)))

没有一种合适的方法来组合功能。这取决于你想做什么。

P.S。有一些方法可以将regex本身组合在一起。天真的方式就是使用|和括号将两者结合起来。我认为有优化器可以改善这种模式。