如何有选择地从domain
中提取local-part@domain
?我的尝试是
Try(email.split("@")(1)).toOption
但是似乎应该有一种不依赖于异常处理的方法。理想情况下,我追求一线。
答案 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>