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

时间:2017-08-24 13:55:45

标签: scala fastparse

我尝试使用FastParse库,但是,我不确定那是我想要做的正确的库。

在我的测试中,我正在寻找一个'数据'放在文本段落的中间,文字是这样的:

  

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

最后一个错误"是scala.MatchError:失败(CharIn(" 0123456789"):1:63 ..."")(类fastparse.core) .Parsed $失败)"

任何人都可以帮助我吗? 提前谢谢你

1 个答案:

答案 0 :(得分:2)

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,因为它已经被<script type="text/javascript"> function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min)) + min; } //The maximum is exclusive and the minimum is inclusive $(document).ready(function() { $("#random-button").on("click", function() { var randomNumber = getRandomInt(100000000, 999999999); $("#random-number").html(randomNumber); }); </script> 解析器捕获了。