如何验证clojure中的电子邮件

时间:2015-11-16 13:22:31

标签: clojure clojurescript

我想使用clojure验证电子邮件。我怎么能这样做。

(defn validate-email [email]

    )

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

5 个答案:

答案 0 :(得分:3)

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

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

如果匹配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

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

答案 1 :(得分:2)

    /* in mainwindow.xaml */
    private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (btnNode.IsChecked == true)
        {
            CreateNode(e.GetPosition(Canvas));
        }

    }

    private void CreateNode(Point origin)
    {
        Node n = new Node("new_" + cmbStart.Items.Count, origin) { Fill = new SolidColorBrush(Colors.Tomato), Width = 60, Height = 60 };
        Canvas.Children.Add(n);

        Canvas.SetLeft(n, origin.X - n.Width/2);
        Canvas.SetTop(n, origin.Y - n.Height/2);
    }

     /* in Node class */

     private void Init(Point p)
     {
        X = p.X;
        Y = p.Y;            
     }

     public double Y
     {
        get { return (double)this.GetValue(YProperty); }
        set { this.SetValue(YProperty, value); }
     }

     public double X
     {
        get { return (double) this.GetValue(XProperty); }
        set { this.SetValue(XProperty, value); }
     }

     public static readonly DependencyProperty XProperty = DependencyProperty.Register("X", typeof(double), typeof(Node), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender));
     public static readonly DependencyProperty YProperty = DependencyProperty.Register("Y", typeof(double), typeof(Node), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender));

     protected override Geometry DefiningGeometry
     {
        get 
        {
            Console.WriteLine("rendering at: " + this.X + ", " + this.Y + "---Scale: " + Width);
            return new EllipseGeometry(new Point(this.X, this.Y), Width, Height);
        }
     }

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

答案 2 :(得分:1)

请注意,使用正则表达式来识别“好”或合法的电子邮件地址是非常难以做到的。有许多边缘情况容易被忽视。它已经变得更加容易,因为一些更加神秘的邮件路由方法已经停止使用,但它仍然很棘手。

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

这将帮助您启动并运行。您还可以查看源代码,了解解决此问题的方法。之后,一旦你有了更多的经验,你可以尝试做类似的事情(但更好:-)你自己

答案 3 :(得分:1)

Clojure有一个非常有用的验证库,即valip
如果你看到predicates.clj文件,你会发现有email-address? }和valid-email-domain?函数和那些完全适合你的porpuse。 所以你可以按如下方式使用它

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

您可以valid-email-domain同时使用email-addressclojureclojurescript使用DatabaseHelper
这是链接:
https://github.com/weavejester/valip/blob/master/src/valip/predicates.clj
与其他有用的验证功能。

答案 4 :(得分:0)

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

读者将#"识别为以"结尾的文字正则表达式。示例:#"(t)+"

您还可以使用re-pattern从字符串编译正则表达式,因此您可以动态创建正则表达式模式,如下所示:(re-pattern (str "^" my-var "$"))

如果您尝试使用正则表达式来完整匹配字符串,则可以使用re-matches。它返回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采用正则表达式和字符串并返回java.util.regex.Matcher。您可以使用find()方法获取下一场比赛,也可以使用Clojure 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的另一个用途是使用正则表达式和字符串来仅返回第一个匹配项:

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

对于很多情况,您会发现re-seq是使用re-find的{​​{1}}的更方便的替代方案。它返回所有匹配的 lazy 序列:

re-matcher

最后,您可以使用replacereplace-first进行搜索和替换。 re-quote-replacement帮助解决了正确转义字符的烦恼问题。