我正在使用scala组合器解析字符串,我想要像
“Ph”或“Ph。”或“Ph.D”或“Ph.D.”要成功解析,其中三个第一个被成功解析,但当我执行println(parseAll(name, "Ph.D."))
时,我看到以下内容:
[1.6] failure: string matching regex `\p{IsLatin}+' expected but end of source found
Ph.D.
^
我的直觉是因为nameSepSubset
是nameSep
使用的规则,rep1(nameSub ~ nameSep)
会消耗“博士”中的所有内容。因此不会产生nameSub ~ nameSepSubset
的输入。
是否有另一个运算符而不是rep1
或另一种定义我的语法的方法来解决这个问题?
语法:
lazy val nameSub = """[a-zA-Z]+""".r
lazy val nameSepSubset = (
rep1(" ")
||| "." ~ rep1(" ")
||| ".")
lazy val nameSep = (
nameSepSubset
||| rep(" ") ~ "," ~ rep(" ")
||| rep(" ") ~> "-" <~ rep(" ")
||| "'")
lazy val name = (rep1(nameSub ~ nameSep) ~ nameSub ~ nameSepSubset
||| nameSub ~ nameSepSubset)