scala提取邮件地址的域名部分

我刚刚学scala,对于这门语言不熟悉。在scala中,如何快速地获取一个邮件地址中的域名(包括@)?例如对于xxx@gmail.com,需要获取到@gmail.com

新的需求是将邮箱的名字部分隐藏,也就是将abc@gmail.com变成******@gmail.com,在javascript里可以用正则实现,在scala里有什么好方法吗?

阅读 13k
7 个回答
val r = """([_A-Za-z0-9-]+(?:\.[_A-Za-z0-9-\+]+)*)(@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)*(?:\.[A-Za-z]{2,})) ?""".r

举个例子:

r.replaceAllIn("abc.edf+jianli@gmail.com   hello@gmail.com.cn", (m => "*****" + m.group(2)))
// 会输出 :
// String = *****@gmail.com  *****@gmail.com.cn

说明:

  • 括号() 是捕捉分组
  • 这样的括号(?:) 是表示不分组
  • 所以这个正则有三个分组,分别是:
    • m.group(0) 是匹配整个正则的字符串
    • m.group(1) 是匹配 @ 前的字符
    • m.group(2) 是匹配 @ 以及之后的字符

可以使用抽取器

object Email{
    def apply(user:String, domain: String) = user + "@" + domain
    def unapply(str: String): Option[(String, String)] = {
        val parts = str split "@"
        if (parts.length == 2) Some(parts(0), parts(1)) else None
    }
}

"Delphin@qq.com" match {case Email(user, domain) => println(s"Username is ${user}, domain is ${domain}")}

val email = "xxx@gmail.com"

val domain = "@" + a.split("@")(1)

email.replaceFirst(".*?(?=@)", "*****")

对问题和回答都无力吐槽。给个传统的做法,还能报告异常情况。

val email = "hello@example.com"
val bad = "hello_bad.com"
val idxOfAt = email.indexOf('@')
if (idxOfAt > 0) {
  email.substring(idxOfAt, email.length)
} else {
  throw new IllegalArgumentException("No correct @!")
}
bad.indexOf('@')

正则表达式。。可以使用grep正则表达在的语法: """[a-zA-Z0-9](@[a-zA-Z0-9-.])""".r

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进