Java Scala 解析器组合器中的正则表达式
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("[A-Z ]+[a-z ]+".r)
也被带走了 Name
、Daughter 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)
}
我的部分输入如下所示。
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("[A-Z ]+[a-z ]+".r)
也被带走了 Name
、Daughter 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)
}