繁体   English   中英

Scala解析器组合器中的Java正则表达式

[英]Java regex in a scala parser combinator

我输入的部分内容如下所示。

Name
John Doe
Sons
Name
Son of John 
28
:
Name
Jane Doe
Daughters
Name
Daughter of Jane 
32
...
...

我的解析器看起来像这样

rep("Name" ~> rep("[A-Z ]+[a-z ]+".r)  ~> ("Sons Name" | "Daughters Name") ~> "[0-9]+") 

但是看起来正则表达式rep("[AZ ]+[az ]+".r)也带走了NameDaughter of Jane Son of John这导致以下错误:

failure: `Daughters ' expected but `2' found

想知道是否有解决此问题的简单方法?

我对您的解析器进行了一些重新配置,并使一些正则表达式更加明确。 另外,我将skipWhitespace设置为false因为它使您可以对匹配的块进行更精细的控制。 我不知道这是否是解决您问题的最惯用的方法,但是它确实有效。 希望能帮助到你。

import scala.util.parsing.combinator._

object Parser extends RegexParsers {

  override val skipWhitespace = false

  val word = """[A-Za-z]+""".r
  val separator = """\s+""".r    
  val colon = """(\s+:\s+)?""".r // optional colon
  val ws = """[^\S\n]+""".r      // all whitespace except newline
  val age = "[0-9]+".r

  val name = (repsep(word, ws) <~ separator) ^^ (_.mkString(" "))
  val nameHeader = "Name" ~ separator
  val childNameHeader = ("Daughters" | "Sons") ~ separator ~ nameHeader

  val person = nameHeader ~> name ~ (childNameHeader ~> name) ~ age <~ colon ^^ (p => (p._1._1, p._1._2, p._2))
  val persons = rep(person)

}

object Main extends App {

  val input  =
    """Name
      |John Doe
      |Sons
      |Name
      |Son of John
      |28
      |:
      |Name
      |Jane Doe
      |Daughters
      |Name
      |Daughter of Jane
      |32""".stripMargin

  val result = Parser.parse(Parser.persons, input)
  // prints '[13.3] parsed: List((John Doe,Son of John,28), (Jane Doe,Daughter of Jane,32))'
  println(result)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM