一线从电子邮件地址中提取域名

时间:2019-09-16 14:59:21

标签: string scala email

如何有选择地从domain中提取local-part@domain?我的尝试是

Try(email.split("@")(1)).toOption

但是似乎应该有一种不依赖于异常处理的方法。理想情况下,我追求一线。

6 个答案:

答案 0 :(得分:4)

不是一个衬纸,仅适用于 2.13 。但这对我来说似乎很清楚。

def extractDomain(email: String): Option[String] = email match {
  case s"${_}@${domain}" => Some(domain)
  case _ => None
}

(请注意,如果有多个@符号,则只会在第一个符号上分割)

答案 1 :(得分:3)

email.dropWhile(_ != '@').drop(1)

答案 2 :(得分:2)

df1

仅当传递的是电子邮件地址时,这些才等效。

如果传递的字符串不包含email.split("@").lastOption ,则@仍将返回整个字符串的lastOption,而您的解决方案将返回Some()

因此,如果您可以信任您的输入,那么此答案将提供更简洁的方法。

答案 3 :(得分:1)

您可以使用Some(email.split("@")(1)),这将拆分String,然后将其包装在Some的实例Option中。

答案 4 :(得分:1)

让我作弊:我将使用提取器准备单独的文件Email.scala

object Email{
  def unapply(mail: String): Option[(String, String)] = {
        mail match {
        case s"$user@$domain" => Some(user, domain)
        case _ => None
      }
  }
}

然后可以与模式匹配一​​起使用:

val Email(_, domain) = "test@domain.com"

答案 5 :(得分:0)

不是单线的,但是当我做match(2.13之前)时,我总是String.split在数组提取器上,我认为它足够短,并且比按索引获取零件要好得多。 / p>

email.split("@", 2) match {
  case Array(_, domainPart @ _*) => domainPart.headOption
}

limit = 2确保domainPart最多包含1个元素。

请注意,在这种情况下您不需要全部使用,因为split将始终返回数组中的至少一个值(尽管用测试覆盖它以防止将来的更改是有意义的)。 / p>

相关问题