加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

与Scala中的任意列表大小匹配

发布时间:2020-12-16 10:07:36 所属栏目:安全 来源:网络整理
导读:假设我有一个无限的东西列表.在这个列表中,我有时会有一些东西表明隐藏的消息即将开始,然后是消息长度,crc,然后是结束令牌.然后列表继续,在某处,会出现一条新消息: a :: b :: start :: 3 :: 1 :: 2 :: 3 :: 4FAA :: end :: x :: y :: z :: .... 将这种模式
假设我有一个无限的东西列表.在这个列表中,我有时会有一些东西表明隐藏的消息即将开始,然后是消息长度,crc,然后是结束令牌.然后列表继续,在某处,会出现一条新消息:

a :: b :: start :: 3 :: 1 :: 2 :: 3 :: 4FAA :: end :: x :: y :: z :: ....

将这种模式匹配到以下结构的最惯用(使用匹配,我认为?)是什么?

size = 3
payload = 1 :: 2 :: 3
crc = 4FAA

另外,考虑到令牌“start”可能出现在有效载荷内部,因此必须依赖“完全匹配”.

解决方法

使用解析器组合器.你的确切解决方案似乎是解析令牌,但为了简化,我假设你只是在阅读一系列用空格分隔的单词.

object P extends scala.util.parsing.combinator.RegexParsers {
  def message: Parser[Any] = properMessage | dummy ~> message
  def properMessage = start ~> body <~ end
  def start = "(?i)start".r
  def end = "(?i)end".r
  def body = (size >> payload) ~ crc
  def crc = word
  def size = "d+".r ^^ (_.toInt)
  def payload = repN(_: Int,word)
  def word = "S+".r
  def dummy = word
}

并且,使用它:

scala> val stream = "a  b  start  3  1  2  3  4FAA  end  x  y  z "
stream: String = "a  b  start  3  1  2  3  4FAA  end  x  y  z "

scala> P.parse(P.message,stream)
res5: P.ParseResult[Any] = [1.35] parsed: (List(1,2,3)~4FAA)

现在,RegexParsers解析了Char的流.由于您有一个令牌流,因此StandardTokenParsers可能是更适合的类.或者您可以将其基于解析器,并将Elem定义为适合您的需求.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读