首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FastParse,在自由文本中搜索表达式

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

Stack Overflow用户
提问于 2017-08-24 13:55:45
回答 1查看 113关注 0票数 1

我正在尝试FastParse库,但是,我不确定我想做的是正确的库。

在我的测试中,我在文本段落的中间寻找一个“数据”,文本如下:

英特尔SSD 180 GB Serie540 S Interfaccia Sata III 6GB/s2.5“

我试图捕捉值"180 GB",但是,经过不同的意图,我不确定它是否可能。

一段代码:

代码语言:javascript
复制
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类)”

有谁可以帮我?先谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-24 14:55:41

AnyChar.rep不会在这里工作,因为什么时候开始使用AnyChar.rep,就不可能回溯。如果它总是以ALPHA开头,也许您可以这样做:

代码语言:javascript
复制
  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解析器捕获。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45863531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档