我正在尝试FastParse库,但是,我不确定我想做的是正确的库。
在我的测试中,我在文本段落的中间寻找一个“数据”,文本如下:
英特尔SSD 180 GB Serie540 S Interfaccia Sata III 6GB/s2.5“
我试图捕捉值"180 GB",但是,经过不同的意图,我不确定它是否可能。
一段代码:
lazy val spaceSep = "\t" | " " | "\r" | "\n" | "\u000C"
val digits = P(CharIn('0' to '9').rep(1).!).map(_.toInt)
lazy val GBSymbol = P( IgnoreCase("gb") | IgnoreCase("gigabyte"))
lazy val GB = P( AnyChar.rep ~ digits.! ~ spaceSep.rep ~ GBSymbol)
testFastParse.GB.parse("INTEL SSD 180 GB Serie 540s Interfaccia Sata III 6 Gb / s 2.5\"")最后一个错误是scala.MatchError: Failure(CharIn("0123456789"):1:63 .“)(fastparse.core.Parsed$Failure类)”
有谁可以帮我?先谢谢你
发布于 2017-08-24 14:55:41
AnyChar.rep不会在这里工作,因为什么时候开始使用AnyChar.rep,就不可能回溯。如果它总是以ALPHA开头,也许您可以这样做:
val spaceSep = P("\t" | " " | "\r" | "\n" | "\u000C")
val digits: P[Int] = P(CharIn('0' to '9').rep(1).!).map(_.toInt)
val GBSymbol = P(IgnoreCase("gb") | IgnoreCase("gigabyte"))
val desc = P((CharIn('A' to 'Z') | CharIn('a' to 'z')).rep)
val GB: P[Int] = P(desc.rep(sep = spaceSep) ~ digits ~ spaceSep.? ~ GBSymbol ~ AnyChar.rep)
GB.parse("INTEL SSD 180 gigabyte Serie 540s Interfaccia Sata III 6 Gb / s 2.5") match {
case Parsed.Success(value, _) => println(value)
case Parsed.Failure(_, _, detail) => println(detail)
}并且需要调用digits.!在那里是不必要的,因为它已经被digits解析器捕获。
https://stackoverflow.com/questions/45863531
复制相似问题