特定文本区域的 Scala 代表分隔符

Scala rep separator for specific area of text

成像我有以下内容:

--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))

open body里面的client可以有你想象的那么多,所以list可以有任意大小,不固定。

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

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

在这种情况下,我只能解析这一行 List((Client: enter)),如何确保您使用的是同一段解析文本?

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

  • 每个客户端由文本分隔 "Client: enter"
  • 那么需要解析非空之后的每一行,用回车分隔return
  • 如果你有一个空行,解析两个行分隔符并尽可能重复步骤 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))