在JSF 2 / PrimeFaces中使用正则表达式进行电子邮件验证

34

我有一个输入框用来输入电子邮件地址:

<h:inputText value="#{register.user.email}" required="true" />

如何在JSF 2/PrimeFaces中使用正则表达式验证输入值是否为有效的电子邮件地址?

5个回答

53
所有基于拉丁字符的正则表达式验证电子邮件格式的尝试都已经失效。它们不支持自2010年5月以来可用的国际化域名。是的,你没看错,非拉丁字符自那时起就被允许在域名和电子邮件地址中使用。
因此有非常多的可能字符需要验证。最好的方法是保持简单。以下正则表达式仅基于@.字符出现来验证电子邮件格式。
<f:validateRegex pattern="([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)" />

再次说明,这只是验证一般的电子邮件格式,而不是验证电子邮件本身是否合法。用户仍然可以输入aa@bb.cc作为地址并通过验证。没有正则表达式可以覆盖所有情况。如果电子邮件地址的有效性非常重要,请将其与身份验证系统相结合。只需向相关的电子邮件地址发送某种激活电子邮件,并提供一个回调链接,让用户通过电子邮件地址登录。

k092167@nu.edu.pk 是一个有效的电子邮件地址,但它不符合这个正则表达式模式的验证,但对于该应用程序仍然加1。 - Syed Anas
2
@anas:对我来说可以工作。也许你需要双反斜杠? - BalusC
是的,也许双反斜杠会起作用。我复制粘贴了你的正则表达式并尝试了一下,但它对于这个电子邮件并没有起作用。 - Syed Anas

47

下面是方法:

我自己使用的方法是...

<h:inputText id="email" value="#{settingsBean.aFriendEmail}" required="true" label="Email" validatorMessage="#{settingsBean.aFriendEmail} is not valid">
    <f:validateRegex pattern="[\w\.-]*[a-zA-Z0-9_]@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]" />
</h:inputText>
<p:message for="email" />

Daniel.


如何更新上面的正则表达式以仅允许有效的域名:.com,.net,.org,.edu? 还有任何关于如何在失去焦点时进行此验证的想法吗? - Mahmoud Saleh
3
这是如何实现的:<f:validateRegex pattern="[\w.-]*[a-zA-Z0-9_]@[\w.-]*[a-zA-Z0-9].(com|net|org|edu)"/> - Daniel
无法处理包含加号的完全有效电子邮件,例如name+surname@domain.com - Igor

10

这是我的代码版本,它运行良好:

<f:validateRegex pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$" />

我制作了一个演示 这里


1

这个支持在电子邮件中使用Unicode域名:

<f:validateRegex pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[\p{L}\p{M}\p{N}.-]*(\.[\p{L}\p{M}]{2,})$" />

...并且只有在输入电子邮件时才验证电子邮件(在表单中电子邮件不是必填字段):

<f:validateRegex pattern="(^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[\p{L}\p{M}\p{N}.-]*(\.[\p{L}\p{M}]{2,})$)?" />

第二个对我非常有用,当表格中的电子邮件不是必填项时。 - Gabriel Patricio Bonilla

0

<p:inputText id="email" required="true" label="email" size="40"
    requiredMessage="Please enter your email address."
    validatorMessage="Invalid email format"
    value="#{userBean.email}">

  <f:validateRegex
    pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$" />

</p:inputText>
<p:watermark for="email" value="Email Address *" />
<p:message for="email" />

<p:commandButton value="test" style="margin:20px"
    action="#{userBean.register}" ajax="false" />


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接