我有几个这样的字符串:
name[arg,arg,arg]
name[arg,arg]
name[arg]
name
我想用scala组合器解析器解析它,这是我设法得到的最好的:
object TaskDepParser extends JavaTokenParsers {
def name: Parser[String] = "[^\\[\\],]+".r
def expr: Parser[(String, Option[List[String]])] =
name ^^ { a => (a, None) } |
name ~ "[" ~ repsep(name, ",") ~ "]" ^^ { case name~_~args~_ => (name, Some(args)) }
}
适用于name
,但无法在name[arg]
上工作 - 说string matching regex
\ z'预计会[' found
。有可能解决它吗?
答案 0 :(得分:4)
object TaskDepParser extends JavaTokenParsers {
def name: Parser[String] = """[^\[\],]+""".r
def expr: Parser[(String, Option[List[String]])] =
name ~ opt("[" ~> repsep(name, ",") <~ "]") ^^ { case name ~ args => (name, args) }
}
使用~>
和<~
,可以仅保留左侧或右侧结果,以避免^^
中不必要的模式匹配。此外,我会使用三重引号来避免大量的转义。
答案 1 :(得分:2)
我认为如果你翻转它可能会有效......名字会被第一条规则搞砸,然后输入就会失败。