2015-01-13 44 views
0

我的輸入的一部分如下所示。斯卡拉分析器組合器中的Java正則表達式

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)也帶走NameDaughter of JaneSon of John這將導致以下錯誤:

failure: `Daughters ' expected but `2' found 

想知道是有一個簡單的方法來解決這個問題?

+0

你想解析器返回數字匹配(我認爲這是一個人的年齡)的每個人,使得在給定的例子預期的解析結果將是'名單(28,32)' ? – edi

+0

我想讓解析器返回'Name','Daughter/Son Name'和他們的'age'。 –

回答

1

我重新制作了一下你的解析器,並且使一些正則表達式更加明確。此外,我已將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) 
} 
相關問題