Reputation: 16718
Adding simple e-mail validation to my code, I created the following function:
def isValid(email: String): Boolean = if("""(?=[^\s]+)(?=(\w+)@([\w\.]+))""".r.findFirstIn(email) == None)false else true
This will pass emails like [email protected]
and fail mails like bobtestmymail.com
, but mails with space characters slip through, like bob @testmymail
will also return true.
I'm probably being silly here...
Upvotes: 13
Views: 13891
Reputation: 1
The below one is the regex for email id with minimum 10 and maximum 30 char length.
scala> val email4 = """[([\w\.!#$%&*+/=?^_`{|}~-]+)@([\w]+)([\.]{1}[\w]+)+]{10,30}""".r
email4: scala.util.matching.Regex = [([\w\.!#$%&*+/=?^_`{|}~-]+)@([\w]+)([\.]{1}[\w]+)+]{10,30}
scala> email4.pattern.matcher("[email protected]").matches
res19: Boolean = false
scala> email4.pattern.matcher("[email protected]").matches
res20: Boolean = true
scala> email4.pattern.matcher("[email protected]").matches
res21: Boolean = false
scala> email4.pattern.matcher("[email protected]").matches
res22: Boolean = false
scala> email4.pattern.matcher("[email protected]").matches
res23: Boolean = true
scala> email4.pattern.matcher("[email protected]").matches
res24: Boolean = true
scala> email4.pattern.matcher("[email protected]").matches
res25: Boolean = true
scala> email4.pattern.matcher("[email protected]").matches
res26: Boolean = false
scala> email4.pattern.matcher("[email protected]").matches
res27: Boolean = true
Upvotes: 0
Reputation: 1
scala> val email4 = """([\w\.!#$%&*+/=?^_`{|}~-]+)@([\w]+)([\.]{1}[\w]+)+""".r
email4: scala.util.matching.Regex = ([\w\.!#$%&*+/=?^_`{|}~-]+)@([\w]+)([\.]{1}[\w]+)+
scala> email4.pattern.matcher("arun#[email protected]").matches
res10: Boolean = false
scala> email4.pattern.matcher("arun#[email protected]").matches
res11: Boolean = true
scala> email4.pattern.matcher("arun#[email protected]").matches
res12: Boolean = true
scala> email4.pattern.matcher("arun#[email protected].").matches
res13: Boolean = false
scala> email4.pattern.matcher("arun#[email protected].").matches
res14: Boolean = false
scala> email4.pattern.matcher("arun#[email protected]").matches
res15: Boolean = true
scala> email4.pattern.matcher("arun#[email protected]").matches
res16: Boolean = false
scala> email4.pattern.matcher("arun#[email protected]").matches
res17: Boolean = true
scala> email4.pattern.matcher("arun#[email protected].").matches
res18: Boolean = false
Upvotes: 0
Reputation: 5344
My function is inspired from the one that the Play Framework uses (see PlayFramework) and uses the regexp presented here: W3C recommendation. Hope it helps. All tests suggested in the other questions are passed.
private val emailRegex = """^[a-zA-Z0-9\.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$""".r
def check(e: String): Boolean = e match{
case null => false
case e if e.trim.isEmpty => false
case e if emailRegex.findFirstMatchIn(e).isDefined => true
case _ => false
}
Upvotes: 30
Reputation: 2346
As I've tested your regex and it was catching simple emails, I then checked your code and saw that you're using findFirstIn. I believe that is your problem. findFirstIn will jump all the spaces until it matches some sequence anywhere in the string. I believe that in your case it's better to use unapplySeq and check if it returns Some List
def isValid(email: String): Boolean =
if("""(?=[^\s]+)(?=(\w+)@([\w\.]+))""".r.findFirstIn(email) == None)false else true
def isValid2(email: String): Boolean =
"""(\w+)@([\w\.]+)""".r.unapplySeq(email).isDefined
isValid("[email protected]") //> res0: Boolean = true
isValid("t es t@gmailcom") //> res1: Boolean = true
isValid("b ob @tes tmai l.com") //> res2: Boolean = false
isValid2("[email protected]") //> res3: Boolean = true
isValid2("t es t@gmailcom") //> res4: Boolean = false
isValid2("b ob @tes tmai l.com") //> res5: Boolean = false
// but those don't work for both:
// I recommend you using a proper regex pattern to match emails
isValid("[email protected]") //> res6: Boolean = true
isValid("test@gmailcom") //> res7: Boolean = true
isValid2("[email protected]") //> res8: Boolean = true
isValid2("test@gmailcom") //> res9: Boolean = true
Upvotes: 4
Reputation: 21817
scala> def isValid(email : String): Boolean = if("""^[-a-z0-9!#$%&'*+/=?^_`{|}~]+(\.[-a-z0-9!#$%&'*+/=?^_`{|}~]+)*@([a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.)*(aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|[a-z][a-z])$""".r.findFirstIn(email) == None)false else true
v: (email: String)Boolean
scala> isValid("""[email protected]""")
res0: Boolean = true
scala> isValid("""bob @test.com""")
res1: Boolean = false
scala> isValid("""bobtest.com""")
res2: Boolean = false
Upvotes: 2