Scala:通过模式匹配拆分字符串

tmp*_*ies 8 string split functional-programming scala pattern-matching

是否有可能将字符串分成lexems

"user@domain.com" match {
    case name :: "@" :: domain :: "." :: zone => doSmth(name, domain, zone)
}
Run Code Online (Sandbox Code Playgroud)

换句话说,就像列表一样......

Ako*_*chy 20

是的,您可以使用Scala的Regex功能执行此操作.

在这个网站上发现了一个电子邮件正则表达式,如果这不适合你,可以随意使用另一个:

[-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+\.[a-zA-Z]{2,4}
Run Code Online (Sandbox Code Playgroud)

我们要做的第一件事是在组周围添加括号:

([-0-9a-zA-Z.+_]+)@([-0-9a-zA-Z.+_]+)\.([a-zA-Z]{2,4})
Run Code Online (Sandbox Code Playgroud)

有了这个,我们有三个小组:在TLD 之前@,之间@和之后的部分..

现在我们可以从中创建一个Scala正则表达式,然后使用Scala的模式匹配unapply来将正则表达式中的组绑定到变量:

val Email = """([-0-9a-zA-Z.+_]+)@([-0-9a-zA-Z.+_]+)\.([a-zA-Z]{2,4})""".r
Email: scala.util.matching.Regex = ([-0-9a-zA-Z.+_]+)@([-0-9a-zA-Z.+_]+)\.([a-zA-Z]    {2,4})


"user@domain.com" match {
    case Email(name, domain, zone) =>
       println(name)
       println(domain)
       println(zone)
}

// user
// domain
// com
Run Code Online (Sandbox Code Playgroud)

  • +1这是我见过语言处理正则表达式的最好方法之一.比许多语言中的替代方案好得多,迫使您手动访问`groups`对象并通过索引或名称找到正确的匹配.好答案. (5认同)

Xav*_*hot 6

首先Scala 2.13,可以String通过不应用字符串插值器来模式匹配 s :

val s"$user@$domain.$zone" = "user@domain.com"
// user: String = "user"
// domain: String = "domain"
// zone: String = "com"
Run Code Online (Sandbox Code Playgroud)

如果您期望输入格式错误,您还可以使用匹配语句:

"user@domain.com" match {
  case s"$user@$domain.$zone" => Some(user, domain, zone)
  case _                      => None
}
// Option[(String, String, String)] = Some(("user", "domain", "com"))
Run Code Online (Sandbox Code Playgroud)