FastParse,在自由文本中搜索表达式

FastParse, search an expression in a free text

我正在尝试 FastParse 库,但是我不确定这是否是我想要做的事情的正确库。

在我的测试中,我正在寻找放在文本段落中间的 'data',文本是这样的:

INTEL SSD 180 GB Serie 540s Interfaccia Sata III 6 Gb / s 2.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\"")

最后一个错误 "is scala.MatchError: Failure(CharIn("0123456789"):1:63 ..."")(class fastparse.core.Parsed$Failure)"

谁能帮帮我? 提前谢谢你

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 解析器捕获。