简体   繁体   中英

FastParse, search an expression in a free text

I'm trying FastParse library, but, I'm not sure then is the correct library for what I want to do.

In my test, I'm looking for a 'data' put in the middle of text paragraph, the text is this:

INTEL SSD 180 GB Serie 540s Interfaccia Sata III 6 Gb / s 2.5"

I'm trying to capture the value "180 GB", but, after different intents, I'm not sure if it's possible.

A bit of code:

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\"")

The last error "is scala.MatchError: Failure(CharIn("0123456789"):1:63 ..."") (of class fastparse.core.Parsed$Failure)"

Can anyone help me? thank you in advance

AnyChar.rep will not work in here since when start with AnyChar.rep , it's not possible to backtrack. if it's always start with the ALPHA maybe you can do it like:

  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)
  }

and also need to call out digits.! is unnecessary in there, since it's already captured by digits parser.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM