33

I have an input field taking an email address:

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

How can I validate the entered value as a valid email address using regex in JSF 2 / PrimeFaces?

BalusC
  • 1,040,783
  • 362
  • 3,548
  • 3,513
Nidheesh
  • 4,192
  • 27
  • 78
  • 144

5 Answers5

53

All regular expression attempts to validate the email format based on Latin characters are broken. They do not support internationalized domain names which were available since May 2010. Yes, you read it right, non-Latin characters are since then allowed in domain names and thus also email addresses.

That are thus extremely a lot of possible characters to validate. Best is to just keep it simple. The following regex just validates the email format based on the occurrence of the @ and . characters.

<f:validateRegex pattern="([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)" />

Again, this just validates the general email format, not whether the email itself is legit. One can still enter aa@bb.cc as address and pass the validation. No one regex can cover that. If the validity of the email address is that important, combine it with an authentication system. Just send some kind of an activation email with a callback link to the email address in question and let the user login by email address.

BalusC
  • 1,040,783
  • 362
  • 3,548
  • 3,513
  • an email k092167@nu.edu.pk is a valid email yet it is not validated by this regex pattern still +1 for the application – Anas Apr 05 '14 at 12:01
  • 2
    @anas: Works for me. Perhaps you need double backslashes? – BalusC Apr 05 '14 at 13:56
  • Yeah maybe double backslashes would do, i copy pasted your regex and tried but it didnt work for only this email. – Anas Apr 07 '14 at 05:34
46

Here is how:

Using it myself...

<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.

Daniel
  • 36,273
  • 9
  • 115
  • 187
10

Here's my version and it works well :

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

And i made a demo here

mkyong
  • 1,979
  • 1
  • 18
  • 14
1

This one supports unicode domain names in email:

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

... and this one validates email only when email is entered (email is not required field in form):

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

m_davari
  • 3
  • 4