Да, вы можете сделать это с функциональностью Scala Regex.
Я нашел email regex on this site, не стесняйтесь использовать другой, если это не устраивает:
[-0-9a-zA-Z.+_][email protected][-0-9a-zA-Z.+_]+\.[a-zA-Z]{2,4}
Первое, что мы должны сделать, это добавить круглые скобки вокруг группы:
([-0-9a-zA-Z.+_]+)@([-0-9a-zA-Z.+_]+)\.([a-zA-Z]{2,4})
С этим мы имеем три группы: часть до @
, между @
и .
, и, наконец, TLD.
Теперь мы можем создать регулярное выражение Scala от него, а затем использовать в Scala pattern matching unapply, чтобы получить группы из Regex, связанные с переменными:
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})
"[email protected]" match {
case Email(name, domain, zone) =>
println(name)
println(domain)
println(zone)
}
// user
// domain
// com
Я не уверен, если вы можете это сделать, но я могу объяснить, почему ваш пример не работает. По сути, у вас есть сопоставление для списка строк, потому что класс '' :: 'case '(https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/immutable /List.scala#L356), также известный как «cons», строит список из элементов. Вам нужен класс case, который принимает два списка и объединяет их, подобно оператору ':::' (но, к сожалению, нет класса ':::' case, как и для cons). – joescii