在Scala中验证电子邮件一行

Jac*_*ack 8 regex scala

在我的代码中添加简单的电子邮件验证,我创建了以下函数:

def isValid(email: String): Boolean = if("""(?=[^\s]+)(?=(\w+)@([\w\.]+))""".r.findFirstIn(email) == None)false else true
Run Code Online (Sandbox Code Playgroud)

这将通过电子邮件喜欢bob@testmymail.com和失败的邮件bobtestmymail.com,但邮件与空格字符滑过,就像bob @testmymail也将返回true.

我可能在这里很傻......

Joh*_*ohn 22

我的功能灵感来自Play Framework使用的功能(请参阅PlayFramework)并使用此处提供的正则表达式:W3C推荐.希望能帮助到你.其他问题中建议的所有测试均通过.

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
}
Run Code Online (Sandbox Code Playgroud)


wle*_*eao 4

当我测试了您的正则表达式并且它正在捕获简单的电子邮件时,我检查了您的代码并发现您正在使用 findFirstIn。我相信这是你的问题。findFirstIn 将跳转所有空格,直到它与字符串中任意位置的某个序列匹配。我相信在你的情况下最好使用 unapplySeq 并检查它是否返回一些列表

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("test@gmail.com")                        //> res0: Boolean = true

isValid("t es t@gmailcom")                       //> res1: Boolean = true

isValid("b ob @tes tmai l.com")                  //> res2: Boolean = false

isValid2("test@gmail.com")                       //> 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("test@gma.i.l.c.o.m")                    //> res6: Boolean = true

isValid("test@gmailcom")                         //> res7: Boolean = true

isValid2("test@gma.i.l.c.o.m")                   //> res8: Boolean = true

isValid2("test@gmailcom")                        //> res9: Boolean = true
Run Code Online (Sandbox Code Playgroud)