Scala rep特定区域的rep分隔符

时间:2015-06-15 12:15:02

标签: scala parser-combinators

成像我有以下几点:

--open
Client: enter
Nick
Age 28
Rosewell, USA

Client: enter
Maria
Age 19
Cleveland, USA
--open--

我需要一个接近以下结果:List(List(Nick, Age 28, Rosewell), List(Maria, Age19, Cleveland))

它可以像你想象的那样在开放体内有很多客户端,所以列表可以有任何大小,它不是固定的。

我试图在以下的帮助下制作:

repsep(".*".r , "Client: enter" + lineSeparator)

在这种情况下,我可以解析这一行List((Client: enter)),如何确保使用相同的解析文本?

1 个答案:

答案 0 :(得分:1)

我猜您正在使用RegexParsers(请注意,默认情况下它会跳过空格)。我假设它以"\n\n--open--"结束(如果你可以改变它,否则我会告诉你如何修改repsep解析器)。通过此更改,我们看到文本具有以下结构:

  • 每个客户端都以文字"Client: enter"
  • 分隔
  • 然后你需要解析后面的每一行非空,用回车符分隔
  • 如果您有一个空行,请解析两个行分隔符,如果可能则重复步骤2,否则意味着我们到达输入的末尾

<小时/> 然后解析器的实现很简单:

object ClientParser extends RegexParsers {

  override def skipWhitespace = false

  def lineSeparator = "\n"
  def root = "--open" ~> lineSeparator ~> rep(client) <~ "--open--"
  def client = ("Client: enter" ~ lineSeparator) ~> repsep(".+".r, lineSeparator) <~ rep(lineSeparator)
}

用:

运行它
--open
Client: enter
Nick
Age 28
Rosewell; USA

Client: enter
Maria
Age 19
Cleveland; USA

--open--

你得到:

[12.9] parsed: List(List(Nick, Age 28, Rosewell; USA), List(Maria, Age 19, Cleveland; USA))