如何在 Clojure 中验证电子邮件

how to validate email in clojure

我想使用 clojure 验证电子邮件。我该怎么做。

(defn validate-email [email]

    )

我想知道如何使用正则表达式编写函数体。

这是一个简单函数的示例,该函数将根据简单的正则表达式检查输入 email 字符串:

(defn validate-email [email]
  (re-matches #".+\@.+\..+" email))

如果匹配 .+\@.+\..+ 正则表达式,它将 return 输入 email,否则 nil

(validate-email "foo@bar.baz") ;=> "foo@bar.baz"
(validate-email "invalid") ;=> nil
(if (validate-email "foo@bar.baz") :valid :invalid) ;=> :valid
(if (validate-email "invalid") :valid :invalid) ;=> :invalid

如果您需要 good 正则表达式来匹配电子邮件,请参阅 Using a regular expression to validate an email address

(defn validate-email
  [email]
  (let [pattern #"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"]
    (and (string? email) (re-matches pattern email))))

就 Clojure 中的正则表达式而言,这可能会有所帮助:http://www.lispcast.com/clojure-regex


或者,funcool/struct can be used to validate email, beside other things.

请注意,众所周知,使用正则表达式来识别 'good' 或合法的电子邮件地址非常困难。有许多容易被忽视的边缘情况。由于一些更神秘的邮件路由方法已不再使用,它​​变得容易得多,但它仍然可能很棘手。

我的建议是使用类似 bouncer 的东西,它是一个验证库,可以在客户端和服务器端使用,即用于 clojure 或 clojurescript。它内置了对电子邮件验证的支持。还有许多其他库做类似的事情。

这会让你起床 运行。您还可以查看源代码以了解解决此问题的一种方法。稍后,一旦你有更多经验,你可以尝试自己做一些类似的事情(但更好 :-)

在 SO 和其他地方有很多关于如何将电子邮件地址与正则表达式匹配的讨论。在我看来,你问的是如何在 Clojure 中使用正则表达式。

reader 将 #" 识别为开始文字正则表达式,以 " 结束。示例:#"(t)+"

您还可以使用 re-pattern 从字符串编译正则表达式,这样您就可以像这样动态创建正则表达式模式:(re-pattern (str "^" my-var "$")).


如果您尝试使用正则表达式来匹配整个字符串,您可以使用 re-matches。它returns nil(不匹配),原始字符串(匹配),或[full-string, capture-1, capture-2, ...]

的向量
(re-matches #"abc" "abcdefg") ;; => nil
(re-matches #"abc.*" "abcdefg") ;; => "abcdefg"
(re-matches #"abc(.)(.*)" "abcdefg") ;; => ["abcdefg", "d", "efg"]

re-matcher takes a regular expression and a string and returns a java.util.regex.Matcher. You can use the find() method to get the next match, or you can use Clojure's re-find.

(def my-matcher (re-matcher #"[aeiou].[aeiou]" "alienate"))
(re-find my-matcher) ;; => "ali"
(re-find my-matcher) ;; => "ena"
(re-find my-matcher) ;; => nil

如果您使用的是匹配器,则可以使用 re-groups 从最近的匹配中获取组。


re-find 的另一个用途是使用正则表达式和字符串 return 只有第一个匹配项:

(re-find #"[aeiou].[aeiou]" "alienate") ;; => "ali"

在许多情况下,您会发现 re-seqre-findre-matcher 更方便。它 return 是所有匹配的 惰性 序列:

(re-seq #"[aeiou].[aeiou]" "alienate") ;; => ("ali", "ena"), lazily

最后,您可以搜索并替换为 replace and replace-first. re-quote-replacement 有助于正确转义字符的烦人问题。

Clojure 有一个非常有用的验证库,即 valip
如果你观察 predicates.clj 文件,你可以看到有 email-address?valid-email-domain? 函数,而这些正是您的海豚。 所以你可以这样使用

(defn validate-email [email] (valid-email-domain? email))

您可以对两个 clojure 使用 valid-email-domain,对 clojureclojurescript 使用 email-address
这是 link:
https://github.com/weavejester/valip/blob/master/src/valip/predicates.clj
与其他有用的验证功能。