【问题标题】:Combing multiple functions into a single function将多个功能组合成一个功能
【发布时间】:2014-02-03 18:58:55
【问题描述】:

我已经编写了几个函数来输入字符串并使用不同的正则表达式来搜索字符串中的模式。所有函数都在相同的输入 [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))

【问题讨论】:

  • 你想通过组合它们来完成什么?有一个功能,可以匹配电话或IP?还是别的什么?
  • 目标是拥有一个可以搜索两种模式的函数。此外,在 Clojure 中优化组合多个函数的通用格式。

标签: regex clojure


【解决方案1】:

如果您想要将多个函数组合成一个函数,该函数将返回将每个函数应用于同一输入的结果,这正是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")]

【讨论】:

    【解决方案2】:

    您的问题有点模糊,但线程箭头的目的是将多个函数依次应用于彼此的输出:例如,(-> 1 inc inc inc) 等价于(inc (inc (inc 1)))

    从您的代码示例中,您似乎有多个正则表达式要与单个输入字符串进行匹配。简单的方法是使用for

    (for [r [#"foo" #"bar" #"baz"]] (re-seq r s))
    

    【讨论】:

      【解决方案3】:

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

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

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

      附:有一些方法可以组合正则表达式本身。天真的方法是只使用 |和括号将两者结合起来。我认为有优化器可以改进这种模式。

      【讨论】:

      • 我用过 |组合多个正则表达式,但这导致我尝试组合的某些功能出现退化问题。退化问题迫使我做多个函数,然后问函数组合的问题。
      • 什么样的退化问题?速度?错误?
      • 组合多个正则表达式,这些正则表达式是给定模式的排列。
      • +Airwoz,如果您在问题中提供更多信息,您可以在这里得到更好的答案。如果您包含一些代码,那就更好了。我是一个,无法理解您之前评论的含义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多