我编写了几个输入字符串的函数,并使用不同的正则表达式来搜索字符串中的模式。所有函数都在同一输入[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))
答案 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本身组合在一起。天真的方式就是使用|和括号将两者结合起来。我认为有优化器可以改善这种模式。