我刚刚学scala,对于这门语言不熟悉。在scala中,如何快速地获取一个邮件地址中的域名(包括@)?例如对于xxx@gmail.com,需要获取到@gmail.com
新的需求是将邮箱的名字部分隐藏,也就是将abc@gmail.com变成******@gmail.com,在javascript里可以用正则实现,在scala里有什么好方法吗?
可以使用抽取器
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 = "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
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)
是匹配@
以及之后的字符
email.replaceFirst(".*?(?=@)", "*****")
val email = "xxx@gmail.com"
val domain = "@" + a.split("@")(1)