Regexp结果到全局地图(scala)

时间:2015-04-28 11:41:32

标签: regex scala parsing

我有一个简单的问题:

我想要一个解析文本结果的值映射:

example.txt
Anna
James
Katy

因此,它应该是大地图 - 像这样:

user_1 : Anna
user_2 : James
user_3 : Katy

我想使用case类将它与解析逻辑分开保存:

case class UserMap(userMap: Map[String, String])

所以,我开始解析它,我需要一些熟悉的东西:

(pseudo-scala)
  def parseTxt: Parser[UserMap] = ".*".r ^^ {
    case res => User(("user_1" -> res))
  }

这里最好的方法是什么?在这种情况下如何使用地图?谢谢

1 个答案:

答案 0 :(得分:1)

如果您想以任何价格使用Scala解析器组合器,那么这是一个解决方案:

import scala.util.parsing.combinator.RegexParsers

object SO29918479 extends App {
  case class UserMap(userMap: Map[String, String])

  object UserParser extends RegexParsers {
    def user: Parser[String] = """[a-zA-Z]+""".r
    def users: Parser[List[String]] = (user ~ "\n".?).* ^^ ( _.map(_._1))
    def userMap: Parser[UserMap] = users ^^ { a =>
      UserMap(a.zipWithIndex.map({case (user, index) => s"user_$index" -> user}).toMap)
    }
  }

  println(UserParser.parse(UserParser.userMap, "Anna\nJames\nKaty"))
}